Postgres设置每个查询资源使用的上限

时间:2018-05-18 23:02:27

标签: database postgresql operating-system reliability

我想知道,当向postgres数据库发出查询时,是否可以设置它可能消耗的各种系统资源的上限。

例如,“X Query在执行过程中的任何一点都可以使用最多但不超过40%的CPU。”

类似于内存,持久存储IO等

我在此设想的用例是防止某些DB用户子集的某些恶意查询完全锁定机器/ db的资源与其他用户,无论是因为查询计划无效,还是数量所涉及的数据对于查询的某些参数有显着差异。

我猜这里有一个不可行/可行的原因,如果是这样的话,我会很感激为什么会有所了解。

1 个答案:

答案 0 :(得分:3)

没有办法在PostgreSQL中为每个查询或每个用户设置资源使用的硬限制,但是,有一些东西可能有助于限制某些类型的资源使用。

有一些设置,temp_buffers和work_mem,它们对某些类型的内存使用设置了一些限制。从手册:

  

temp_buffers(整数)

     

设置每个数据库使用的最大临时缓冲区数   会话。这些是仅用于访问的会话本地缓冲区   临时表。默认值为8兆字节(8MB)。那个设定   可以在单个会话中更改,但仅在第一个会话之前更改   在会话中使用临时表;后来的尝试   更改该值对该会话没有影响。

     

会话将根据需要分配临时缓冲区,直至达到限制   由temp_buffers给出。在会话中设置较大值的成本   实际上并不需要很多临时缓冲区只是一个缓冲区   temp_buffers中每个增量的描述符或大约64个字节。然而   如果实际使用缓冲区,则将消耗额外的8192个字节   对于它(或通常,BLCKSZ字节)。

     

work_mem(整数)

     

指定内部排序操作要使用的内存量   和写入临时磁盘文件之前的哈希表。价值   默认为4兆字节(4MB)。请注意,对于复杂查询,   几个排序或散列操作可能并行运行;每   操作将被允许使用与此值一样多的内存   在开始将数据写入临时文件之前指定。也,   几个运行会话可以同时执行此类操作。   因此,使用的总内存可能是其值的许多倍   work_mem;选择时,有必要牢记这一事实   值。排序操作用于ORDER BY,DISTINCT和合并   连接。散列表用于散列连接,基于散列的聚合和   基于哈希的IN子查询处理。

您还可以通过更改用户角色来限制用户可以立即建立的连接数:

ALTER USER user_name WITH CONNECTION LIMIT 2;

这可能有助于限制用户可以同时运行的进程数。