运行一个流量适中的 LAMP 站点,但偶尔会出现峰值。为了诊断导致高流量期间速度变慢的瓶颈,我一直在查看 mod_status 的输出,发现那里报告的 CPU 使用率与我们所有其他监控工具以及 top 和 mpstat 中显示的 CPU 使用率之间存在惊人的差异。
下面是 mpstat 的输出,这是服务器在正常负载下的典型输出(对于我们所做的事情来说,它应该超负荷了,这使得速度变慢更加令人沮丧):
Linux 2.6.18-274.7.1.el5 (xxxxxxxxxx) 10/25/2012
03:58:14 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
03:58:14 PM all 2.02 0.01 0.16 0.41 0.01 0.07 0.00 97.32 3398.80
03:58:14 PM 0 0.14 0.01 0.08 0.01 0.00 0.00 0.00 99.76 999.98
03:58:14 PM 1 0.93 0.01 0.13 0.12 0.00 0.03 0.00 98.78 58.25
03:58:14 PM 2 0.79 0.01 0.09 0.07 0.00 0.03 0.00 99.02 57.08
03:58:14 PM 3 1.44 0.01 0.17 0.57 0.00 0.03 0.00 97.78 33.10
03:58:14 PM 4 0.75 0.01 0.07 0.06 0.00 0.03 0.00 99.08 53.83
03:58:14 PM 5 0.36 0.01 0.04 0.09 0.00 0.01 0.00 99.49 8.92
03:58:14 PM 6 0.85 0.01 0.09 0.19 0.00 0.03 0.00 98.82 48.18
03:58:14 PM 7 1.34 0.00 0.13 0.54 0.00 0.03 0.00 97.96 36.87
03:58:14 PM 8 0.15 0.01 0.03 0.01 0.00 0.00 0.00 99.80 0.14
03:58:14 PM 9 0.94 0.00 0.07 0.08 0.00 0.03 0.00 98.87 51.87
03:58:14 PM 10 1.18 0.01 0.16 0.06 0.00 0.03 0.00 98.56 53.50
03:58:14 PM 11 8.35 0.01 0.58 1.55 0.02 0.30 0.00 89.20 375.46
03:58:14 PM 12 1.08 0.01 0.09 0.06 0.00 0.03 0.00 98.72 56.58
03:58:14 PM 13 1.14 0.00 0.10 0.28 0.03 0.13 0.00 98.32 907.31
03:58:14 PM 14 4.73 0.01 0.28 1.08 0.01 0.14 0.00 93.75 198.19
03:58:14 PM 15 8.15 0.01 0.48 1.76 0.02 0.29 0.00 89.30 459.54
几乎同时,这是 apache 的 mod_status 输出:
Current Time: Thursday, 25-Oct-2012 15:57:55 EDT
Restart Time: Thursday, 25-Oct-2012 15:40:09 EDT
Parent Server Generation: 3
Server uptime: 17 minutes 46 seconds
Total accesses: 8606 - Total Traffic: 283.4 MB
CPU Usage: u322.08 s32.5 cu0 cs0 - 33.3% CPU load
8.07 requests/sec - 272.3 kB/second - 33.7 kB/request
20 requests currently being processed, 492 idle workers
我并不指望这两者完全一致,但这似乎是一个相当大的差异。我不知道 Apache 是如何得出这个数字的,而且文档似乎相当稀少。
是否有某种方式可以将 Apache 的 CPU 使用率限制在某个任意水平,并且 mod_status 反映了此限制?我继承了此服务器,但初始设置时并未在场,因此完全有可能出于未知原因将某些神秘设置设置为病态值。这可以解释很多,但我在配置中看不到任何相关内容。如果不是这种情况,是否以某种不明显的方式计算该数字,而该数字实际上有意义,或者其中一个来源或另一个来源只是显示不正确的信息?
任何见解都将不胜感激。
答案1
我应该早点弄清楚,但我觉得我第一次检查时数学搞砸了。显然,这完全可以用记录的 CPU 时间除以自上次服务器重启以来的时钟时间来表达。
因此,在这种情况下,用户空间所用时间 322 秒加上系统调用所用时间 32 秒,总 CPU 时间是 354 秒。加上自上次重启以来的 1066 秒,我们得到了 33% 的数字。
显然这不能扩展到多个 CPU,因此我们只考虑可能的 1600% 中的 33%,这似乎更加合理。
答案2
你是对的,mpstat -P ALL
显示自服务器启动以来的负载(检查uptime
),并且 mod_status 仅显示负载17 minutes 46 seconds
。