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

Postgres queries intermittently running extremely slowly

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

我们试图查看同时发生的服务器条件,例如 RAM、CPU 和查询负载,但没有什么明显的。这会影响极少数的查询——可能不到 1%。这确实不是 似乎是一个查询优化问题,因为受影响的查询本身是多种多样的,在某些情况下非常简单。

我们在临时服务器上尽可能地重现了相同的环境并对其进行了重载,并且没有出现该问题。

任何人都可以建议可能的步骤来调查发生这种情况时 Postgres 中发生的情况,或者我们应该考虑的任何其他事情吗?我们已经为此工作了一个多星期,但 运行 没有想法。

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

您应该使用 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

这会使日志更有价值,但它会大大减慢处理速度,所以我不愿意在生产系统上这样做。