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

Nie*_*ian 6 postgresql central-processing-unit io performance-tuning

我目前真的在为一个性能问题而苦苦挣扎,当我的数据库服务器处于“重”负载时,我所有的数据库查询比平时多花费 1000 倍。

我有一台运行 ubuntu 12.04 并托管我的 postgresql 9.2 数据库的服务器。服务器在 Hetzner.de 上,它是 EX6s(8 核氙气,32Gb ram 和两个 3T HDD,在使用 ubuntus 软件 raid 的 RAID1 设置中)。当我运行大量查询(我经常在晚上完成)时,我发现几乎所有 CPU 使用量都花在了 CPU I/O 等待上。我安装了新的遗物监控,我似乎找不到任何其他迹象表明可能是这种 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

数据库服务器网络 I/O (Mb/s) - 该网络是一个千兆内部网络,所有通信都在其上进行。 https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7

按挂钟时间排名前 5 位的数据库操作 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
Run Code Online (Sandbox Code Playgroud)

EEA*_*EAA 5

简而言之,您需要更快的磁盘。

当进程处于 iowait 时,这意味着它们已经发出 IO 请求,并且正在等待该请求的结果。有了足够的 RAM,您的大部分工作集将被缓存在 RAM 中,因此,读取不会对这种 IO 争用产生很大影响,因此写入通常是罪魁祸首。

关于您的磁盘 IO 图,我怀疑 New Relic 出于某种原因没有正确收集 IO 指标。我建议可能研究像 Munin 这样的辅助数据收集系统。除此之外,您可以通过发出以下命令实时查看磁盘 IO:

$ iostat -k 1
Run Code Online (Sandbox Code Playgroud)

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