Postgres 突然变慢和更高的 CPU 使用率

Zep*_*dio 6 postgresql amazon-ec2

我们正在运行一个大约 38GB 的​​ Postgres 数据库,托管在一个 68GB 的​​ EC2 实例上。它一直在嗡嗡作响,负载约为 0.7(在 8 核机器上)并且 CPU 使用率很少,直到大约 16 小时前,当时 CPU 使用率在几个小时内上升,现在比以前高得多(大约 20 %),平均负载也相应增加(现在在 5 到 8 之间)。

根据 pg_stat_activity 的数据,这台机器可以同时看到 100 到 300 个连接。我们最大的表大约 9.0GB,包括索引。

以下是我们排除的情况:

  • pg_top 显示总是有几个线程以高 CPU 百分比运行,而它们下面的其余线程看起来很好。那里的 SELECT 和 INSERT 没有什么特别之处。
  • IOWait 根本没有增加,而且我们似乎没有更频繁地访问磁盘
  • 据我们所知,使用模式没有改变。事实上,星期一比周末慢
  • 我们增加了 memcached 实例的大小,但无济于事
  • 我们关闭了 synchronous_commit,但这也没有多大帮助
  • 我们已经尝试增加和减少共享缓冲区(目前设置为 2GB);4GB 和 1GB 都没有改进
  • 重新启动 postgres 和我们所有的 apache 服务器都没有帮助
  • 重新启动我们的 Apache/Django 机器用来与 Postgres 通信的 pgbouncer,也被证明是徒劳的
  • 我们所有的主要查询都有正确的索引,并且我们已经验证 postgres 正在使用它们。为了安全起见,我们运行了 VACUUM ANALYZE,查询规划器看起来做对了
  • 查询会在几秒钟内正常,然后似乎锁定;通常需要 200 毫秒或更短时间的索引扫描将需要整整几秒钟。

关于如何进行或追踪此问题的任何想法?

小智 9

如果可以,请在短时间内(约 10 分钟)打开完整日志记录。保存日志,并让 pgfouine ( http://pgfouine.projects.postgresql.org/ ) 对其进行分析。可能您执行的查询比以前更多,或者您执行的查询效率不高。

接下来,您可能会有一些缓慢的查询严重影响事情。看看现在正在运行哪些查询:

SELECT pg_stat_activity.procpid AS pid, pg_stat_activity.usename AS username, pg_stat_activity.waiting, now() - pg_stat_activity.query_start AS age, pg_stat_activity.current_query AS query FROM pg_stat_activity WHERE pg_stat_activity.current_query <> '<IDLE>'::text ORDER BY now() - pg_stat_activity.query_start DESC;

在列表顶部查找查询。是否已经运行了很长时间?如果您的交易已经打开了 16 个小时以上,它肯定会减慢很多速度。