postgresql服务器上奇怪的高CPU I / O等待

目前我正在为性能问题而烦恼,当我的数据库服务器处于“繁重”负载下时,所有的数据库查询都比正常情况下高出1000倍。

我有一台运行Ubuntu 12.04的服务器,并托pipe我的postgresql 9.2数据库。 服务器在Hetzner.de上,它是一个EX6s(32Gb ram的8核心氙气,以及使用ubuntus软件raid的RAID1设置中的两个3T硬盘)。 当我运行大量的查询(我经常在夜里完成)时,我发现几乎所有的CPU使用率都花在CPU I / O等待上。 我安装了新的文件监视器,似乎无法find任何可能是此CPU I / O等待根源的其他迹象,这显然是我的性能和吞吐量的瓶颈。

所以问题是,这个CPU I / O等待什么,等待什么?

我添加了所有的概述图表,我可以从下面的新文物中得到。 我忽略了什么? 必须有一个明显的瓶颈? 我应该在哪里下潜?

数据库服务器CPU使用率 – 告诉我有什么不对的错误https://rpm.newrelic.com/public/charts/cEdIvvoQZCr

数据库服务器负载平均值https://rpm.newrelic.com/public/charts/cMNdrYW51QJ

数据库服务器物理内存https://rpm.newrelic.com/public/charts/c3dZBntNpa1

数据库服务器磁盘I / O利用 – 你可以看到磁盘似乎并没有被非常多的使用(几乎没有) https://rpm.newrelic.com/public/charts/9YEVw6RekFG

数据库服务器networkingI / O(Mb / s) – networking是一个千兆位内部networking,所有通信都是在这个networking上进行的。 https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7

前五名数据库操作挂钟时间https://rpm.newrelic.com/public/charts/dCt45YH12FK

数据库吞吐量https://rpm.newrelic.com/public/charts/bIbtQ1mDzMI

数据库响应时间https://rpm.newrelic.com/public/charts/fPcNL8WA6xx

更新:

做完sudo iostat -k 1我开始怀疑了。 我得到了很多这样的输出,我没有看到NR:

 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 sdb 0.00 0.00 0.00 0 0 sdc 546.00 2296.00 6808.00 2296 6808 sdd 593.00 1040.00 7416.00 1040 7416 md1 0.00 0.00 0.00 0 0 md0 0.00 0.00 0.00 0 0 md2 1398.00 3328.00 13064.00 3328 13064 md3 0.00 0.00 0.00 0 0 

总之,你需要更快的磁盘。

当进程在iowait中时,这意味着他们已经发出IO请求,正在等待请求的结果。 有了足够的内存,大部分的工作集都会被caching在内存中,因此读取操作并不会影响这个IO争用,所以写入操作通常是罪魁祸首。

关于你的磁盘IO图,我怀疑由于某种原因,New Relic没有正确地收集IO指标。 我build议可能寻找像Munin这样的二级数据收集系统。 简而言之,您可以通过发出以下命令实时观看磁盘IO:

 $ iostat -k 1 

这将输出实时磁盘读取和写入,以kbps为单位。 我怀疑你会看到New Relic没有看到的活动。