Postgres:检查点太频繁发生

use*_*922 13 postgresql

我们有一个功能强大的Postgres服务器(64核,384 GB RAM,16个15k SAS驱动器,RAID 10),并且在白天我们多次重建几个大型数据集,这是非常密集的.Apache和Tomcat也在同一台服务器上运行.

我们每天都会收到300次这样的警告,同时重建这些数据集,并且长时间内误差平均为2 - 5秒:

2015-01-15 12:32:53 EST [11403]: [10841-1] LOG:  checkpoints are occurring too frequently (2 seconds apart)
2015-01-15 12:32:56 EST [11403]: [10845-1] LOG:  checkpoints are occurring too frequently (3 seconds apart)
2015-01-15 12:32:58 EST [11403]: [10849-1] LOG:  checkpoints are occurring too frequently (2 seconds apart)
2015-01-15 12:33:01 EST [11403]: [10853-1] LOG:  checkpoints are occurring too frequently (3 seconds apart)
Run Code Online (Sandbox Code Playgroud)

这些是相关设置:

checkpoint_completion_target    0.7
checkpoint_segments 64
checkpoint_timeout  5min
checkpoint_warning  30s
wal_block_size  8192
wal_buffers     4MB
wal_keep_segments   5000
wal_level   hot_standby
wal_receiver_status_interval    10s
wal_segment_size    16MB
wal_sync_method     fdatasync
wal_writer_delay    200ms
work_mem    96MB
shared_buffers  24GB
effective_cache_size    128GB
Run Code Online (Sandbox Code Playgroud)

这意味着我们每2到5秒写入1024 MB的WAL文件,有时持续15到30分钟.

1)您是否看到我们可以改进的任何设置?如果您需要记录其他设置,请与我们联系.

2)我们可以使用"SET LOCAL synchronous_commit TO OFF"; 在这些写入密集型事务的开始,让这些WAL写入在后台发生更多一点,对其余操作的影响较小?

我们正在重建的数据存储在其他地方,因此在电源故障的情况下,RAID电池备份不能完成它的工作,一旦数据集再次重建,我们就不会出现任何问题.

将"SET LOCAL synchronous_commit TO OFF"; 如果这种情况持续15-30分钟会导致任何问题?或者导致使用WAL发送器的流式复制出现问题?

谢谢!

PS.我希望三星开始发售他们的SM1715 3.2 TB PCIe企业级固态硬盘,因为我认为它可以很好地解决我们的问题.

Ben*_*imm 15

由于wal_level设置为hot_standby,您的服务器正在生成如此多的WAL数据.我假设你需要这个,所以避免警告的最佳选择是增加你的checkpoint_segments.但它们只是 - 警告 - 在批量更新和数据加载过程中看到它们是非常普遍和完全正常的.你恰好经常更新.

更改synchronous_commit不会更改写入wal的内容,而是更改提交返回以允许操作系统缓冲这些写入的时间.

它可能不适用于您的架构,但您可以使用未记录的表来保存一些WAL数据以进行数据重建.您的副本将无法访问这些表,但在重建之后,您将能够从未记录的兄弟姐妹更新已记录的表.