【发布时间】:2012-10-18 03:39:42
【问题描述】:
我们最近升级到了 postgresql 9.1.6(从 8.3)。我们的测试服务器表明 max_pred_locks_per_transaction 应至少设置为 900(这远远超出了建议的设置 64)。
我们现在正在生产中,我不得不多次增加这个参数,因为我们的日志将开始填充:
ERROR: 53200: out of shared memory
HINT: You might need to increase max_pred_locks_per_transaction.
客户端连接设置为 600(但池系统永远不会超过 100 个客户端):
max_pred_locks_per_transaction: 我们去了3000。大约一天就用完了。 去了9000,3天左右就用完了。
我现在将它设置为 30000,由于这个数字是每个允许的客户端连接分配的平均数,我现在有大约 5 GB 的共享内存专用于锁定空间!
我确实将 shared_buffers 设置得相当高(目前为 24GB),超过了 40% 的 RAM 数字。 (我计划在下次重启时将其调低至 RAM 的 25% 左右)。
编辑:这个调整结果是个坏主意。我的数据库有很多繁重的查询,并且有一半的大 RAM 专用于 shared_buffers 可以防止它阻塞,因为它可以完全缓存更大的表。
平均而言,我一次会看到大约 5-10 个活动查询。我们的查询负载远超过了我们的更新负载。
有人愿意告诉我如何找出这里出了什么问题吗?有了这么小的更新集,我真的不明白为什么我们经常会用完锁……这对我来说确实闻起来像泄漏。
有人知道如何检查锁的去向吗? (例如,关于这个问题,我如何阅读 pg_locks 的内容)
【问题讨论】:
-
在 Slony 中使用“订阅集”时,我在 9.1 中遇到此错误。我们没有在旧 PostgreSQL 版本中遇到错误,但表的大小相当。
-
看来我的问题是由于将 Slony 2.0.x 与 PostgreSQL 9.1 一起使用所致。据报道升级到 Slony 2.1.x 将解决这个问题。