在 PostgreSQL 中增加共享缓冲区的缺点是什么

What is the downside to increase shared buffer in PostgreSQL

我注意到在查询 PostgreSQL 时,当数据未加载到 shared_buffer 时,性能会显着下降,差异几乎可以达到 100 倍。所以在优化查询的过程中,我想知道是否有通过增加 shared_buffer.

来提高性能

然后我开始研究PostgreSQL中的shared_buffer。我发现推荐值是 OS 内存的 25%,PostgreSQL 将利用 OS 缓存来加速查询。但是从我自己的数据库中看到的,从磁盘读取与 shared_buffer 有很大的不同,所以我最想从 shared_buffer 查询。

所以我想知道,如果我在 PostgreSQL 中增加 shared_buffer 有什么缺点?如果我只增加只读实例中的 shared_buffer 怎么办?

一些工作负载(我知道 DROP TABLE,但可能还有其他工作负载)在较小的 shared_buffers 下表现更好。但本质上,这是一个反复试验的问题(或者更好:可重现的性能测试)。

如果你能让 shared_buffers 足够大,它可以容纳你从数据库中需要的一切,那可能是一个不错的选择。

增加缓冲区高速缓存的缺点是双缓冲。当您需要将页面读入 shared_buffers 时,它可能首先需要驱逐现有页面以为其腾出空间。但是 OS 缓存可能也需要从自身中逐出一个页面,以便为它从实际磁盘读取页面腾出空间。然后你最终会在两个地方找到同一个页面,这会浪费缓存 space。因此,不是从 OS 缓存中读取页面,而是更有可能需要从实际磁盘读取它,这要慢得多。从双缓冲的角度来看,您可能希望 shared_buffers 远小于系统 RAM 的一半(使用 OS 缓存作为主缓存)或远大于一半(使用 shared_buffers作为主缓存)

另一个缺点是,如果它太大,您可能会开始出现内存不足错误或调用 OOM 杀手或以其他方式破坏系统稳定性。

另一个问题是,在一些操作之后,比如 DROP TABLE、TRUNCATE,或者在某些情况下 COPY 的结束,PostgreSQL 需要使很多缓冲区无效,并选择通过搜索整个缓冲区来实现。缓冲区高速缓存。如果你做了很多这样的操作,那个时间真的可以加大缓冲区缓存设置。