可以PostgreSQL的9.1漏锁吗? (出共享存储器/增加max_pred_locks_pe

2019-09-24 06:03发布

我们最近升级到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的共享内存的专用锁的空间!

我有设置相当高(24GB的时刻),其中超过40%的RAM人物的shared_buffers。 (我计划在下次重新启动调下来的RAM约25%)。

编辑:这调整被证明是一个坏主意。 我的数据库是它有很多沉重的查询,并致力于的shared_buffers大RAM具有半防止它窒息,因为它可以完全缓存较大的表。

平均而言,我看到某处大约5-10活动查询一次。 我们查询负载远远超过了我们的更新负荷。

有人关心告诉我,我怎么会追查到底是怎么回事错在这里? 有了这样一个小更新一套,我真的不明白,为什么我们正在耗尽锁经常的......它确实闻起来像泄漏给我。

任何人都知道如何检查,其中锁了? (例如,如何可能我读pg_locks对相对于内容这个问题)

Answer 1:

这听起来似乎很容易被长时间运行的事务引起的。 对于一个事务谓词锁不能被释放,直到所有重叠的读写交易完成。 这包括准备交易。

看看这两个pg_stat_activitypg_prepared_xacts为其启动(或准备)超过几分钟前更加任何交易。

唯一的其他可能,非错误的解释我能想到的是,你有数百或数千分区表。

如果没有这些解释是有道理的,我很想得到我的手可重复的测试案例。 有什么办法来创建表,使用generate_series(查询填充它们),使这个发生在可预见的方式? 有了这样的测试案例我可以肯定地追查原因。



Answer 2:

据http://www.progtown.com/topic1203868-error-out-of-shared-memory.html它可能是有意义的减少work_mem配置参数。

又见https://dba.stackexchange.com/questions/27893/increasing-work-mem-and-shared-buffers-on-postgres-9-2-significantly-slows-down了解更多详细信息。



文章来源: Can PostgreSQL 9.1 leak locks? (out of shared memory/increase max_pred_locks_per_transaction)