我想知道,在向 postgres 数据库发出查询时,是否可以设置它可能消耗的各种系统资源的上限。
例如,“X Query 在执行过程中的任何时候都可能使用最多但不超过 40% 的 CPU。”
类似于内存、持久存储 IO 等。
我在这里设想的用例是防止某些数据库用户子集的一些恶意查询完全锁定其他用户的机器/数据库资源,无论是因为查询计划无效,还是涉及的数据量是查询的某些参数显着不同。
我猜这是不可能/可行的原因,如果是这种情况,我将不胜感激了解原因。
我想知道,在向 postgres 数据库发出查询时,是否可以设置它可能消耗的各种系统资源的上限。
例如,“X Query 在执行过程中的任何时候都可能使用最多但不超过 40% 的 CPU。”
类似于内存、持久存储 IO 等。
我在这里设想的用例是防止某些数据库用户子集的一些恶意查询完全锁定其他用户的机器/数据库资源,无论是因为查询计划无效,还是涉及的数据量是查询的某些参数显着不同。
我猜这是不可能/可行的原因,如果是这种情况,我将不胜感激了解原因。
在 PostgreSQL 中,无法对每个查询或每个用户的资源使用设置硬性限制,但是,有几件事可能有助于限制某些类型的资源使用。
有几个设置 temp_buffers 和 work_mem 对某些类型的内存使用设置了一些限制。从手册:
temp_buffers(整数)
设置每个数据库会话使用的最大临时缓冲区数。这些是会话本地缓冲区,仅用于访问临时表。默认值为八兆字节 (8MB)。该设置可以在单个会话中更改,但只能在会话中第一次使用临时表之前进行;随后尝试更改该值将对该会话没有影响。
会话将根据需要分配临时缓冲区,直到 temp_buffers 给出的限制。在实际上不需要很多临时缓冲区的会话中设置一个大值的成本只是一个缓冲区描述符,或者大约 64 字节,每个 temp_buffers 增量。但是,如果实际使用了缓冲区,则将为其消耗额外的 8192 字节(或通常为 BLCKSZ 字节)。
work_mem(整数)
指定写入临时磁盘文件之前内部排序操作和哈希表要使用的内存量。该值默认为四兆字节 (4MB)。请注意,对于复杂的查询,可能会并行运行多个排序或散列操作;在开始将数据写入临时文件之前,将允许每个操作使用此值指定的内存。此外,几个正在运行的会话可以同时执行此类操作。因此,使用的总内存可能是 work_mem 值的许多倍;在选择值时必须牢记这一事实。排序操作用于 ORDER BY、DISTINCT 和合并连接。哈希表用于哈希连接、基于哈希的聚合和基于哈希的 IN 子查询处理。
您还可以通过更改用户角色来限制用户一次可以建立的连接数:
ALTER USER user_name WITH CONNECTION LIMIT 2;
这可能有助于限制用户可以同时运行的进程数。