我的一个Postgresql服务器托管了几个(1-3)数据库,这些数据库接收一个恒定的数据流.数据没有特别的结构,它相当于当前时间和该特定时刻的各种观察数据.数据率相当高;对于一个数据库,它每天大约一千兆字节,大约是另一个数据库的十分之一.我不指望这个比率会增加.读取性能优先级低得多,目前可以接受.
在日志中我有这样的消息:
LOG: checkpoints are occurring too frequently (15 seconds apart) HINT: Consider increasing the configuration parameter "checkpoint_segments".
此值目前设置为16,这是由pgtune提供的.
我应该考虑提高写性能的设置是什么?我宁愿保持尽可能安全.考虑到进入的数据量,只要大部分数据完好无损,我就可以接受失败的一些最新数据.
编辑:我现在正在使用Postgresql 9.0,但我打算升级到9.1.我没有发布硬件细节,因为虽然我承认它们的重要性,但我最终还是需要在具有各种硬件的几台机器上进行优化.如果硬件对答案至关重要,请告诉我一般信息,以便我可以将答案应用于具有不同硬件配置的机器.
每天1千兆字节的写入负载并不高.全天传播,每秒大约50千字节.慢速USB拇指驱动器可以处理.我假设它更加突兀.如a_horse_with_no_name建议的那样,增加检查点段. 100左右并非与众不同.
然后将checkpoint_timeout增加到1小时,并查看将checkpoint_completion_target增加到接近1.0(100%)的值.完成目标告诉Postgresql如何积极地在后台写入,以便在运行检查点之前完成x%,这会强制所有数据从WAL中立即写出,并且会在系统发生时使系统变慢.
你通常不把它设置为100%的原因是,不止一次写入同一个块是很常见的,并且通过延迟WAL写入主存储,你可以防止同一个块被无理地写入两次.
如果你不太可能在你的超时发生之前不止一次写入同一个块,即你所做的就是插入然后将它设置得非常高,将其提高到0.9左右是有意义的.最糟糕的情况是,你会比你原本需要的更频繁地写一些,但检查点的影响将会大大减少.