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

Pat*_*arx 5 database postgresql operating-system reliability

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

例如,“X Query 在执行过程中的任何时候可能会使用最多但不超过 40% 的 CPU。”

类似的还有内存、持久化存储IO等。

我在这里设想的用例是防止某些数据库用户子集的恶意查询完全锁定其他用户的机器/数据库资源,无论是因为查询计划无效,还是涉及的数据量太大查询的某些参数明显不同。

我猜这是不可能/不可行的原因,如果是这样的话,我将不胜感激对原因的一些见解。

Gre*_*ius 3

在 PostgreSQL 中,无法对每个查询或每个用户的资源使用设置硬性限制,但是,有一些事情可能有助于限制某些类型的资源使用。

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

temp_buffers(整数)

设置每个数据库会话使用的临时缓冲区的最大数量。这些是会话本地缓冲区,仅用于访问临时表。默认值为八兆字节 (8MB)。该设置可以在各个会话中更改,但只能在会话中首次使用临时表之前进行;后续尝试更改该值不会对该会话产生任何影响。

会话将根据需要分配临时缓冲区,最多可达 temp_buffers 给出的限制。在实际上不需要许多临时缓冲区的会话中设置较大值的成本只是一个缓冲区描述符,即 temp_buffers 中每个增量的大约 64 字节。然而,如果实际使用缓冲区,则将消耗额外的 8192 字节(或者一般来说,BLCKSZ 字节)。

work_mem(整数)

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

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

ALTER USER user_name WITH CONNECTION LIMIT 2;
Run Code Online (Sandbox Code Playgroud)

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