Postgres突然变慢,CPU使用率更高

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

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

以下是我们排除的内容:

  • pg_top表明总是有几个线程运行CPU百分比高,而其余线程下面的线程看起来很好。 那里没有什么特别的SELECT和INSERT。
  • IOWait一点也没有增加,而且似乎也不像我们经常使用磁盘
  • 据我们所知,使用模式并没有改变, 事实上,周一比周末慢
  • 我们增加了memcached实例的大小,无济于事
  • 我们closures了synchronous_commit,但这也没有多大帮助
  • 我们已经尝试了增加和减less共享缓冲区(目前设置为2GB)。 4GB和1GB都没有改善
  • 重新启动postgres和我们所有的Apache服务器没有帮助
  • 重新启动pgbouncer,我们的Apache / Django盒子用来与Postgres交谈,也被certificate是不成熟的
  • 我们所有的主要查询都有正确的索引,我们已经validation了postgres正在使用它们。 为了安全起见,我们运行了一个VACUUM ANALYZE,查询计划员看起来是正确的
  • 查询将罚款几秒钟,然后似乎locking; 通常需要200毫秒或更less的索引扫描则需要几秒钟的时间。

任何想法如何进行,或追踪这个问题?

如果可以的话,打开完整的日志logging(~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个小时以上的交易,肯定会使事情减慢很多。