刚才我被迫远程重启我的 CentOS 6.3 系统,因为超高负载(75!)导致系统瘫痪。这是一个为 WordPress 博客(mySQL + PHP)提供服务的 Web/邮件服务器。
是否有任何日志我可以分析并尝试找出原因?
这是我从系统收到的关于昨天事件的电子邮件:
This is an automated message notifying you that the 5 minute load average on your system is 75.91.
This has exceeded the 10 threshold.
One Minute - 83.24
Five Minutes - 75.91
Fifteen Minutes - 39.35
top - 22:25:30 up 122 days, 7:28, 0 users, load average: 99.14, 80.70, 42.31
Tasks: 298 total, 1 running, 297 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.2%us, 0.5%sy, 0.0%ni, 98.1%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1020176k total, 956828k used, 63348k free, 2788k buffers
Swap: 4194296k total, 1391900k used, 2802396k free, 25164k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19352 448 444 S 0.0 0.0 0:08.27 /sbin/init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
3 root RT 0 0 0 0 S 0.0 0.0 0:09.43 [migration/0]
4 root 20 0 0 0 0 S 0.0 0.0 1884:48 [ksoftirqd/0]
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 [migration/0]
6 root RT 0 0 0 0 S 0.0 0.0 0:06.06 [watchdog/0]
7 root RT 0 0 0 0 S 0.0 0.0 0:07.81 [migration/1]
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 [migration/1]
9 root 20 0 0 0 0 S 0.0 0.0 7:25.62 [ksoftirqd/1]
10 root RT 0 0 0 0 S 0.0 0.0 0:04.58 [watchdog/1]
11 root 20 0 0 0 0 S 0.0 0.0 4:48.95 [events/0]
12 root 20 0 0 0 0 S 0.0 0.0 9:13.85 [events/1]
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [cgroup]
14 root 20 0 0 0 0 S 0.0 0.0 0:08.21 [khelper]
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [netns]
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [async/mgr]
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [pm]
18 root 20 0 0 0 0 S 0.0 0.0 0:21.72 [sync_supers]
19 root 20 0 0 0 0 S 0.0 0.0 0:20.65 [bdi-default]
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd/0]
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd/1]
22 root 20 0 0 0 0 S 0.0 0.0 5:26.09 [kblockd/0]
23 root 20 0 0 0 0 S 0.0 0.0 0:22.90 [kblockd/1]
我不确定这是否有帮助。
一切似乎都使用了 0% 的 CPU..
这是另一封电子邮件..
This is an automated message notifying you that the 5 minute load average on your system is 70.53.
This has exceeded the 10 threshold.
One Minute - 94.79
Five Minutes - 70.53
Fifteen Minutes - 32.68
top - 22:23:34 up 122 days, 7:26, 0 users, load average: 96.88, 74.74, 35.91
Tasks: 283 total, 2 running, 281 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.2%us, 0.5%sy, 0.0%ni, 98.1%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1020176k total, 970440k used, 49736k free, 3196k buffers
Swap: 4194296k total, 1249404k used, 2944892k free, 29836k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6715 apache 20 0 217m 7804 3252 D 1.9 0.8 0:00.28 /usr/sbin/httpd -k start -DSSL
6770 apache 20 0 218m 8772 3368 D 1.9 0.9 0:00.28 /usr/sbin/httpd -k start -DSSL
6799 apache 20 0 301m 8088 3184 D 1.9 0.8 0:00.14 /usr/sbin/httpd -k start -DSSL
7265 root 20 0 15160 1220 808 R 1.9 0.1 0:00.02 /usr/bin/top -c -b -n 1
7266 root 20 0 15160 1220 808 R 1.9 0.1 0:00.02 /usr/bin/top -c -b -n 1
1 root 20 0 19352 448 444 S 0.0 0.0 0:08.27 /sbin/init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
3 root RT 0 0 0 0 S 0.0 0.0 0:09.43 [migration/0]
4 root 20 0 0 0 0 S 0.0 0.0 1884:48 [ksoftirqd/0]
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 [migration/0]
6 root RT 0 0 0 0 S 0.0 0.0 0:06.06 [watchdog/0]
7 root RT 0 0 0 0 S 0.0 0.0 0:07.81 [migration/1]
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 [migration/1]
9 root 20 0 0 0 0 S 0.0 0.0 7:22.58 [ksoftirqd/1]
10 root RT 0 0 0 0 S 0.0 0.0 0:04.58 [watchdog/1]
11 root 20 0 0 0 0 S 0.0 0.0 4:48.95 [events/0]
12 root 20 0 0 0 0 S 0.0 0.0 9:13.85 [events/1]
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [cgroup]
14 root 20 0 0 0 0 S 0.0 0.0 0:08.21 [khelper]
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [netns]
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [async/mgr]
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [pm]
18 root 20 0 0 0 0 S 0.0 0.0 0:21.72 [sync_supers]
是的,我正在使用 Apache。 75 是最近 5 分钟的平均负载。
答案1
使用的交换量表明交换可能是罪魁祸首。 vmstat 的输出会在问题场景中更好地显示这一点。
vmstat 1 30
但是,top 或 vmstat 都不太适合事后诊断问题。
我的一般建议是安装该sysstat
软件包。这将使系统指标能够定期保存,然后可以通过 检索信息sar
。 Sysstat 可以配置大量详细信息,但默认配置将为您提供 CPU 使用情况、系统负载、分页和交换的初步概述。
yum install sysstat
sar
sar -q
sar -B
sar -W
然而,如果这没有什么用处,您可能需要更深入地研究。除了进程队列(平均负载)之外,可能发生的某些事情无法通过常见性能指标立即看到。一种可能性是 CPU 忙于处理过多的中断请求,导致进程排队等候系统剩余的可用处理时间。
如果是这样的话,你也许可以在 /proc/interrupts 中找到一些线索
cat /proc/interrupts
也许网络适配器或本地计时器显示异常多的中断?
这可能归结为熟悉perf
并等待下一次问题的发生。一旦出现问题就开始记录,或者使用在高平均负载时触发的脚本自动执行该过程。
perf record -a
perf report
Perf 提供了系统操作的极其详细的视图,但也会收集大量数据并产生大量开销,使其连续运行变得不切实际。
对于 CentOS 6.3,升级到 CentOS 6.4 后神秘的高平均负载可能会消失,这解决了与本地计时器相关的内核源代码中的错误。但是,您的问题也可能是由硬件供应商提供的任何给定驱动程序引起的。
答案2
除非您有一些带有日志记录的系统监控,否则很难判断事后高系统负载的原因。
性能下降的一个常见原因是 RAM 耗尽导致的系统抖动。
在大多数 Unix 系统上,抖动不会导致高负载,但 Linux 确实会在此指标中考虑等待 I/O 的进程,因此这里可能就是这种情况。
答案3
要找出哪些进程有问题:
运行top -H
(-H
启用显示线程)
键盘快捷键因版本而异。
对于较旧的 top(3.3 之前?):
按Shift+o调出排序选项。
然后w按进程状态排序。
然后Enter返回主页。
然后Shift+R来反转排序。
使用较新的 top(3.3?及更高版本):
按f调出字段选项。
使用箭头键转至S = Process Status
并按s。
按q返回主页。
按Shift+R反转排序。
然后在该S
列中查找具有D
或 的进程R
(它们现在应该位于顶部)。这些将是对系统负载有贡献的进程。
如果进程显示D
,则表示“不间断睡眠”。通常这是当进程等待 I/O(磁盘、网络等)时引起的。
如果进程显示 a R
,则意味着它只是在进行正常计算。
要了解有关这些进程正在执行的操作的更多信息:
与旧的顶部:
按f然后y启用该WCHAN
字段。
与新的顶部:
按f调出字段选项。
使用箭头键转到WCHAN = Sleeping in Function
并按下d以启用它。
然后q返回主页。
如果您的系统具有必要的内核选项,并且系统上存在 wchan 文件(我忘了它在哪里,叫什么),该WCHAN
字段应该显示进程当前正在运行的内核函数(如果该字段仅在所有内容上显示 a-
或 a ?
,则不支持)。
在这里谷歌一下,你应该就可以了。
如果您没有 wchan 支持,您可以随时尝试查看strace
进程以了解它们在做什么,但这是一种困难的方法。