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

4
我想知道在向postgres数据库发出查询时,是否可以设置各种系统资源的上限。例如,“X查询在执行过程中最多只能使用40%的CPU”。类似地,还有内存、持久性存储IO等方面的限制。我希望防止一些DB用户子集的某些流氓查询完全锁定机器/数据库的资源,无论是因为查询计划无效,还是涉及的数据量对于某些查询参数而言显着不同。我猜想这不可能或不可行,如果是这样的话,我希望了解其原因。

项目的范围无法与其运行平台上的所有资源控制方法进行接口。对于Linux,请使用cgroups - Laurenz Albe
1个回答

3
在PostgreSQL中,无法针对每个查询或用户设置资源使用的硬限制,但是有一些方法可以帮助限制某些类型的资源使用。
有一些设置,例如temp_buffers和work_mem,可以为某些类型的内存使用设置一些限制。从手册中可以看到:
temp_buffers(整数):设置每个数据库会话使用的临时缓冲区的最大数量。这些是仅用于访问临时表的会话本地缓冲区。默认值为8兆字节(8MB)。可以在单个会话中更改该设置,但只能在会话中首次使用临时表之前进行;随后尝试更改该值将不会影响该会话。会话将根据需要分配临时缓冲区,直到达到temp_buffers所设置的限制。在实际上不需要许多临时缓冲区的会话中设置较大值的成本仅为一个缓冲区描述符,或约64字节,每增加一个temp_buffers。但是,如果实际上使用了缓冲区,则将额外消耗8192字节(或通常情况下为BLCKSZ字节)。
work_mem(整数):指定在写入临时磁盘文件之前由内部排序操作和哈希表使用的内存量。该值默认为4兆字节(4MB)。请注意,在复杂查询中,可能会同时运行多个排序或哈希操作;每个操作将被允许在开始将数据写入临时文件之前使用与该值相同的内存量。此外,可能会有几个正在运行的会话同时执行此类操作。因此,使用的总内存可能是work_mem值的许多倍;在选择值时必须记住这一事实。排序操作用于ORDER BY、DISTINCT和合并连接。哈希表用于哈希连接、基于哈希的聚合和IN子查询的基于哈希的处理。
您还可以通过更改用户角色来限制用户可以同时进行的连接数。
ALTER USER user_name WITH CONNECTION LIMIT 2;

这可以帮助限制用户同时运行的进程数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接