有没有办法找出我的服务器负载高的原因

有没有办法找出我的服务器负载高的原因

刚才我被迫远程重启我的 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进程以了解它们在做什么,但这是一种困难的方法。

相关内容