配置PostgreSQL的写入性能


30

我的PostgreSQL服务器之一托管着几个(1-3)数据库,这些数据库接收恒定的数据流。数据不是特别结构化的,它等于当前时间以及该特定时刻的各种观测数据。数据速率相当高;对于一个数据库,它一天的工作量约为1 GB,而对于另一个数据库,它的工作量约为每天的十分之一。我不希望这个比率增加。读取性能的优先级要低得多,目前可以接受。

在日志中,我有此消息:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

此值当前设置为16,这是由提供的pgtune

我应该考虑哪些设置来提高写入性能?我希望保持尽可能的安全。考虑到传入的数据量,我可以接受一次失败就丢失一些最近的数据,只要其中的大部分数据是完整的即可。

编辑:我现在正在使用PostgreSQL 9.0,但是我计划升级到9.1。我不会发布硬件细节,因为尽管我承认它们的重要性,但最终我将需要在硬件非常多样化的多台机器上进行此优化。如果硬件对于答案是必不可少的,请给我基本信息,这样我就可以将答案应用于具有不同硬件配置的机器。


您可以发布您的版本,最好发布一些有关存储硬件的详细信息吗?
杰克·道格拉斯

您是否checkpoint_segments按照建议增加了?发生了什么?
a_horse_with_no_name 2012年

3
这类问题的另一个绝佳资源是格雷戈里·史密斯Gregory Smith)的书《PostgreSQL 9.0 High Performance》
2012年

Answers:


24

每天1 GB的存储量并不高。整天传播出去,每秒约有50 KB。较慢的USB拇指驱动器可以解决此问题。我以为它虽然比较爆裂。正如a_horse_with_no_name所建议的那样,增加检查点段。100左右并非不寻常。

然后将您的时间checkpoint_timeout增加到1小时,并考虑将您的速度checkpoint_completion_target增加到接近1.0(100%)。完成目标告诉PostgreSQL如何在后台积极地执行后台操作,以便在运行检查点之前完成x%的工作,这迫使所有数据立即从WAL中写入,并且会在发生问题时减慢系统对爬网的速度。

通常不将其设置为100%的原因是,多次写入同一块是很常见的,并且通过延迟WAL写到主存储区,可以防止无缘无故地将同一块写入两次。

如果不太可能在超时发生之前多次写入同一块,即您所做的就是插入,那么将其设置得很高可以将其提高到0.9左右。发生的最坏情况是,您写的频率会比您原本需要的要多一些,但是检查点的影响将大大减少。


实际上,写入量几乎是完全一致的:这是硬件监视软件的数据存储,它每秒24x7连续轮询一次。我可以计算出确切的数据速率,但是随着程序员添加和删除监视点,它会有所波动。
丹尼尔·里昂斯2012年

1
好吧,如果速率是每天1G并且很平稳,那么几乎任何子系统都可以处理写负载,您只想保持平稳即可,将检查点完成目标设置为接近1.0,并且较长的检查点超时将使您满意。
Scott Marlowe'1

10

在非常“繁重的写入”系统中,您可能会受到峰值活动期间写入WAL的速率的限制。

如果您确实可以“接受失败时丢失一些最近的数据”,则可以关闭同步提交,它可以:

当绩效比交易的持久性更重要时,它可能是一个有用的选择

如果您能够更改硬件,则可以考虑采用以下任何一种方法来优化写入:

  • RAID10 over RAID5
  • 大量主轴(例如,可能意味着2.5英寸而不是3.5英寸)
  • SATA上的SAS
  • 15K超过10K驱动器
  • 固态硬盘

- 编辑

根据您对@Scott 出色答案的评论:“写入量实际上几乎完全均匀”,以及隐含的数据速率“每秒50 KB”,我怀疑您是否需要做任何可能导致数据丢失的事情。可能会有助于了解其他配置参数的设置。


3
如果写性能很重要,则操作系统和旋转硬盘驱动器之间的电池供电控制器可能会产生很大的不同。
Scott Marlowe'1

5

您可能还检查了提交的频率/大小:最近我遇到了一个问题,我试图在单笔交易中更新> 100万条记录。我收到了类似于OP描述的日志消息,但是即使经过几个小时,事务也无法完成。当我将写入分为几个较小的事务(大约10,000条记录)时,所需的总时间减少到大约15分钟。

认为发生的事情是Postgres花了很多时间来写日志,以至于checkpoint_timeout在保存记录之前取得了实质性进展。我不确定该解释是否成立。我仍然收到警告,但是所有写操作最终都会处理。但是,我需要(并找到)一种编程解决方法,而不是需要数据库重新配置的解决方法。

另请参见http://www.postgresql.org/docs/9.3/static/wal-configuration.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.