我目前真的在为一个性能问题而苦苦挣扎,当我的数据库服务器处于“重”负载下时,我所有的数据库查询比正常情况多出 1000 倍。
我有一台运行 ubuntu 12.04 并托管我的 postgresql 9.2 数据库的服务器。服务器在 Hetzner.de 上,它是一个 EX6s(8 核氙气,32Gb 内存和两个 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
简而言之,您需要更快的磁盘。
当进程处于 iowait 状态时,这意味着它们已发出 IO 请求,并正在等待该请求的结果。有了足够的 RAM,您的大部分工作集都将缓存在 RAM 中,因此,读取不会对这种 IO 争用产生很大影响,因此写入通常是罪魁祸首。
关于您的磁盘 IO 图,我怀疑 New Relic 出于某种原因没有正确收集 IO 指标。我建议可能会研究像 Munin 这样的辅助数据收集系统。除此之外,您可以通过发出以下命令实时查看磁盘 IO:
这将以 kbps 为单位输出实时磁盘读写。我怀疑您会在那里看到很多 New Relic 看不到的活动。