我们有一个强大的Postgres服务器(64核,384 GB RAM,1615k 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)这些是相关的设置:
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这意味着我们每2-5秒编写1024 MB的WAL文件,有时持续15-30分钟。
( 1)你看到什么我们可以改进的设置吗?如果你需要其他设置的话请告诉我。
2)我们是否可以使用“将本地synchronous_commit设置为OFF”;在这些编写密集型事务开始时,让这些WAL写入在后台发生得更多,对其他操作的影响较小?
我们正在重建的数据存储在其他地方,因此一旦断电和RAID电池备份没有完成它的工作,一旦数据集再次被重建,我们就不会退出任何工作。
如果这种情况持续15-30分钟,“将本地synchronous_commit设置为关闭”会导致任何问题吗?或者对使用WAL发送器的流复制造成任何问题?
谢谢!
PS。我希望三星开始发布他们的SM1715 3.2TB PCIe企业SSD,因为我认为它能很好地解决我们的问题。
发布于 2015-01-15 21:30:13
由于wal_level设置为hot_standby,您的服务器正在生成如此多的WAL数据。我假设您需要这样做,因此避免警告的最佳选择是增加您的checkpoint_segments。但它们只是--警告--在批量更新和数据加载过程中看到它们是非常常见和完全正常的。你只是碰巧经常更新。
更改synchronous_commit并不会改变写入WAL的内容,而会改变提交返回的时间,从而允许操作系统缓冲这些写入。
它可能不适用于您的架构,但是您可以使用未记录的表来重新构建数据,从而保存一些WAL数据。您的副本将无法访问这些表,但是在重建之后,您将能够从它们未登录的兄弟姐妹中更新您的日志表。
https://stackoverflow.com/questions/27972393
复制相似问题