我目前确实在努力解决一个性能问题,当我的数据库服务器处于“重”负载下时,所有数据库查询所花的时间比平时多 1000 倍。
我有一台运行 ubuntu 12.04 并托管我的 postgresql 9.2 数据库的服务器。该服务器位于 Hetzner.de 上,它是一台 EX6s(8 核 xenon,32GB RAM 和两个 3T HDD,使用 ubuntus 软件 raid 进行 RAID1 设置)。当我运行大量查询(我经常在晚上进行)时,我发现几乎所有 CPU 使用率都花在了 CPU I/O 等待上。我安装了新的 Relic 监控,似乎找不到任何其他迹象表明此 CPU I/O 等待的根本原因,这显然是我的性能和吞吐量的瓶颈。
那么问题是,这个CPU I/O等待是什么,它在等待什么?
我在下面添加了所有我能从 New Relic 获得的概览图表。我忽略了什么?一定存在明显的瓶颈?我应该从哪里开始?
数据库服务器 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
答案1
简而言之,您需要更快的磁盘。
当进程处于 iowait 状态时,这意味着它们已发出 IO 请求,并且正在等待该请求的结果。如果有足够的 RAM,您的大部分工作集将缓存在 RAM 中,因此读取不会对这种 IO 争用造成很大影响,因此写入通常是罪魁祸首。
关于您的磁盘 IO 图,我怀疑 New Relic 出于某种原因没有正确收集 IO 指标。我建议可能研究一下 Munin 之类的辅助数据收集系统。除此之外,您还可以通过发出以下命令实时查看磁盘 IO:
$ iostat -k 1
这将输出实时磁盘读取和写入(以 kbps 为单位)。我猜你会看到 New Relic 未看到的大量活动。