我有一台 CentOS-5 服务器,负载很少。“sar”命令的典型输出如下:
02:20:01 PM CPU %user %nice %system %iowait %steal %idle
02:30:01 PM all 0.63 0.00 1.23 0.31 0.00 97.84
02:40:01 PM all 0.92 0.32 1.34 0.45 0.00 96.97
02:50:01 PM all 0.76 0.00 0.93 0.77 0.00 97.54
03:00:01 PM all 0.41 0.00 0.72 0.15 0.00 98.72
03:10:01 PM all 0.78 0.32 1.49 1.83 0.00 95.58
03:20:01 PM all 0.27 0.00 0.50 0.62 0.00 98.61
但是,我观察到每天晚上 4:10 AM,CPU 使用率都非常高。除了一个月中的几天外,几乎每天晚上都会发生这种情况。“sar”命令显示如下内容:
03:00:01 AM all 0.10 0.00 0.10 0.11 0.00 99.68
03:10:01 AM all 0.08 0.32 0.18 0.21 0.00 99.21
03:20:01 AM all 0.03 0.00 0.03 0.19 0.00 99.76
03:30:01 AM all 0.01 0.00 0.02 0.06 0.00 99.91
03:40:02 AM all 0.75 0.32 3.21 15.43 0.00 80.28
03:50:01 AM all 0.95 0.00 3.43 9.25 0.00 86.36
04:00:01 AM all 0.69 0.00 3.79 4.86 0.00 90.66
04:10:01 AM all 22.38 0.54 4.47 30.92 0.00 41.69
04:20:01 AM all 2.99 0.02 4.58 4.95 0.00 87.46
04:30:01 AM all 0.34 0.00 0.61 13.22 0.00 85.83
04:40:01 AM all 0.05 0.32 0.17 0.52 0.00 98.95
04:50:01 AM all 0.22 0.00 0.36 0.11 0.00 99.32
05:00:01 AM all 0.23 0.00 0.36 0.12 0.00 99.28
我如何确定是什么导致了 CPU 使用率和 iowait 等出现峰值?我检查了 /var/log/messages,但无法确定。当时没有其他 cron 作业或其他要运行的程序。由于这显示在 %user 下,我只能确定这是某个用户进程。我如何才能准确确定原因?
答案1
这是cron.daily
脚本运行的时间...默认情况下,它每天凌晨 4:00 之后运行。
从/etc/crontabs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily <-- THIS ONE!!
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
并且在/etc/cron.daily
。
罪魁祸首可能是您的mlocate.cron
,它updatedb
在某些系统上运行可能会非常密集:
#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }')
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
答案2
根据 /etc/crontab 中的说明,每天凌晨 04:02 会有一个自动 cron 运行:
[...]
02 4 * * * root run-parts /etc/cron.daily
运行ls /etc/cron.daily/将显示计划于凌晨 04:02 运行的命令(它们按顺序执行)。您可以轻松修改它们以在执行“之前”和执行之后输出负载。
但是,如果这是标准的 CentOS 安装,那么导致高负载的脚本很有可能是 mlocate.cron、0logwatch(如果已安装)或 logrotate。
mlocate 将执行完整的文件系统扫描(这可以解释系统中增加的 i/o 等待),0logwatch 将解析您的日志文件(可能非常大,导致 i/o 操作),并且如果 logrotate 在文件系统之间移动文件,它也会产生大量 i/o。
答案3
既然你说这种情况几乎每天都在 4:10 发生,那么一个粗略的方法就是ps aux
在 4:05 到 4:15 之间每分钟运行一次 cron,并将输出写入文件中。然后,您可以检查占用 CPU 的命令的 %CPU 使用率。
答案4
可能是一个 cron 作业 - 可能是“locatedb”正在更新?
在晚上添加您自己的 cron'd 输出“ps”可能有助于发现罪魁祸首。