我们正在运行一个大约 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 毫秒或更短时间的索引扫描将需要整整几秒钟。
关于如何进行或追踪此问题的任何想法?