PostgreSQL中的work_mem和max_wal_size


大多数 PostgreSQL 配置参数不会对整体系统性能产生巨大影响。当从默认值进行调整时,有一些确实可以产生巨大的差异。如work_mem和max_wal_size。

max_wal_size
控制 PostgreSQL 执行检查点之前预写日志可以在磁盘上获得的大小。这不是一个硬性限制;PostgreSQL 调整检查点频率以保持磁盘上的 WAL 不大于该值,但绝对可能会发生超出该值的偏移。唯一需要花费的就是磁盘空间;太大了没有其他问题。
太小max_wal_size会导致检查点频繁发生。频繁的检查点是不好的,原因有两个:

  1. shared_buffers检查点本身很昂贵,因为需要写出所有脏缓冲区。
  2. 在检查点之后第一次更改页面时,整个页面都会写入 WAL,而不仅仅是更改。在繁忙的系统上,这可能是一次非常重要的 WAL 活动突发。
以下是正确设置的过程max_wal_size:
首先,设置常规检查点参数:

checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
wal_compression = on
log_checkpoints = on
max_wal_size = 16GB

然后,让系统运行,并检查日志(或您可能需要确定检查点频率的任何其他工具)。如果检查点发生的频率高于每 15 分钟一次,请增加检查点的数量,max_wal_size直到超时触发检查点。

min_wal_size
这控制了 PostgreSQL 将在磁盘上保留的保留 WAL 文件的数量,即使由于其他原因不需要它。这可以稍微加快 WAL 的速度,因为 PostgreSQL 可以使用这些保留的文件之一,而不必创建一个新文件。提高它并没有什么坏处(同样,它所花费的只是磁盘空间),但在几乎所有环境中,性能影响很小。