0

PostgreSQL 如何从资源消耗的角度保护会话?

比如我写了一些存储过程:

  1. 一个执行高度 cpu-bound 紧密循环的存储过程,PostgreSQL 如何防止它占用大部分可用 cpu?
  2. 一个触发大量 IO 的存储过程,PostgreSQL 是如何让它不占用大部分 IO 带宽的呢?
  3. 一个存储过程读取没有其他会话引用的广泛分散的页面,PostgreSQL如何防止它填满缓冲池?

此外,据我了解,每个 PostgreSQL 会话对应于不同的操作系统进程,所以我还想知道 PostgreSQL 明确处理的资源消耗隔离以及操作系统执行依赖于什么(作为操作系统调度机制的一部分)。

非常感谢。

皮亚卡

4

1 回答 1

0

PostgreSQL 中的进程没有资源限制,每个进程都会消耗尽可能多的 CPU 和 I/O。

PostgreSQL 后端运行单线程这一事实在一定程度上缓解了这种情况,因此单个后端不能消耗数据库服务器的所有资源。但是请注意,PostgreSQL 具有并行查询,因此(使用默认配置)最多三个进程可以处理单个语句。您可以通过设置max_parallel_workers_per_gather为 0 来减少它。

一条语句可以从共享缓冲区中驱逐多少页也没有限制。但是除非该语句多次触及单个页面,否则该语句读入的页面的使用计数将保持低水平,并且缓冲区可以再次从缓存中逐出。还有一个针对大型顺序扫描的优化:如果估计表会爆出超过四分之一的共享缓冲区,则使用仅包含一小部分共享缓冲区的“环形缓冲区”对其进行扫描。

于 2021-12-07T18:23:23.630 回答