CentOS - 夜间特定时间 CPU 使用率高

CentOS - 夜间特定时间 CPU 使用率高

我有一台 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”可能有助于发现罪魁祸首。

相关内容