postgresql - Postgres : Checkpoints Are Occurring Too Frequently

标签 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)

这些是相关设置:

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) 我们可以使用“SET LOCAL synchronous_commit TO OFF;”吗?在这些写入密集型事务开始时让这些 WAL 写入更多地在后台发生,对其余操作的影响更小?

我们正在重建的数据存储在别处,因此如果电源出现故障并且 RAID 备用电池无法正常工作,一旦数据集再次重建,我们就不会出任何问题。

将“将本地同步提交设置为关闭;”如果这种情况持续 15 - 30 分钟,会造成任何问题吗?或者导致我们使用 WAL 发送器的流复制出现任何问题?

谢谢!

附言。我希望三星开始发售他们的 SM1715 3.2 TB PCIe 企业级 SSD,因为我认为它可以很好地解决我们的问题。

最佳答案

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

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

它可能不适用于您的架构,但您可以通过使用未记录的表进行数据重建来潜在地保存一些 WAL 数据。您的副本将无法访问这些表,但在重建之后您将能够从它们未记录的 sibling 中更新您记录的表。

关于postgresql - Postgres : Checkpoints Are Occurring Too Frequently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972393/

相关文章:

python - 使用 psycopg2 执行多组参数的查询

ruby-on-rails - Rails 和外键

sql - 在 postgresql 选择中,将时间戳列添加到 additional_days 列

sql - 删除 postgresql (SQL) 中的方括号

sql - 如何在 Postgresql 中执行返回按月分组创建的数据计数的查询?

sql - select and join 错误必须出现在 GROUP BY 子句中或在聚合函数中使用

php - PostgreSQL - 树组织

sql - 删除 SQL 结果中的 SUM 列

ruby-on-rails - 使用 Arel 表达 CTE

postgresql - PostgreSQL 故障转移能否在 32 位和 64 位主机共享的存储上运行?