Postgres查询间歇性地运行非常缓慢

时间:2018-10-29 06:39:16

标签: postgresql database-performance

我们的一些查询在我们的生产环境中间歇地极慢地运行。这些是JSONB交集查询,通常以毫秒为单位返回,但需要30-90秒。

我们尝试查看同时发生的服务器状况,例如RAM,CPU和查询负载,但是没有明显的现象。这会影响极少数查询-可能少于1%。由于受影响的查询本身是多种多样的,并且在某些情况下非常简单,因此,不是似乎不是查询优化问题。

我们已经在登台服务器上尽可能地复制了相同的环境,并将其重载,并且不会发生此问题。

有人能建议可能的步骤来调查发生在Postgres中的事情,或者我们应该考虑的其他事情吗?我们已经为此进行了一个多星期的工作,并且没有足够的想法。

1 个答案:

答案 0 :(得分:1)

很难猜出问题的原因;一种解释是锁。

您应该使用auto_explain来调查问题。

postgresql.conf中,使用以下设置:

# log if somebody has to wait for a lock for more than one second
log_lock_waits = on
# log slow statements with their parameters
log_min_duration_statement = 1000
# log the plans of slow statements
shared_preload_libraries = 'auto_explain'
# configuration for auto_explain
auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 1000

然后重新启动PostgreSQL。

现在,所有超过一秒的语句都将其计划转储到PostgreSQL日志中,因此您要做的就是等待问题再次发生,以便您可以对其进行分析。

如果您进行设置,也可以得到EXPLAIN (ANALYZE, BUFFERS)输出

auto_explain.log_buffers = on
auto_explain.log_analyze = on

这将使日志更加有价值,但会大大降低处理速度,因此我不愿意在生产系统上进行处理。