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
这会使日志更有价值,但它会大大减慢处理速度,所以我不愿意在生产系统上这样做。
我们有一些查询 运行 在我们的生产环境中间歇性地非常缓慢。这些是 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
这会使日志更有价值,但它会大大减慢处理速度,所以我不愿意在生产系统上这样做。