我有一个实验室,里面有 16 个 HP Z620 系统,全部一样(同时购买),安装的 Ubuntu 12.04 完全相同,当前内核为 3.13.0-44-generic。嗯,不是相当所有都一样:其中 15 个的 BIOS 版本为 J61 v03.06,第 16 个的 BIOS 版本为 J61 v03.18。所有都具有静态 IP 地址,并且禁用了网络管理器、avahi-daemon 和 cups-browsed。
奇怪的是,这 15 个系统的平均负载远小于 1(在我撰写本文时,uptime 显示的平均负载为 0.00),但第 16 个系统的平均负载始终为 1.00 或更高。以下是顶部快照:
top - 13:13:04 up 25 min, 3 users, load average: 1.00, 1.03, 0.91
Tasks: 203 total, 1 running, 202 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.9 us, 0.3 sy, 0.0 ni, 97.5 id, 1.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 12232332 total, 1583716 used, 10648616 free, 63148 buffers
KiB Swap: 12505084 total, 0 used, 12505084 free. 626708 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 33772 3024 1468 S 0.0 0.0 0:00.79 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.10 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
7 root 20 0 0 0 0 S 0.0 0.0 0:01.64 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.28 rcuos/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.23 rcuos/1
10 root 20 0 0 0 0 S 0.0 0.0 0:00.20 rcuos/2
11 root 20 0 0 0 0 S 0.0 0.0 0:01.95 rcuos/3
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/3
我很困惑为什么这个盒子上的平均负载总是 1.00 或更高。有什么建议吗?
顺便说一句,我将系统 16 上的 BIOS 升级到了版本 3.85,但这并没有改变任何东西。我还安装了 Ubuntu 14.04,但仍然出现同样的情况。
答案1
当 top 没有将 CPU 使用率或 I/O 等待确定为平均负载的来源时,通常它是一个或几个处于不可中断睡眠状态的任务(在您的情况下是一个任务)。使用以下命令识别它们:
ps -e -o state,pid,cmd | grep ^D
也可以使用 vmstat,但只能提供处于不可中断睡眠状态的任务数。例如:
doug@doug-64:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 168 69980 124836 2525672 0 0 252 29 1 0 0 0 99 0
不间断睡眠中的任务位于“procs”下的“b”列下。
如果不观察 CPU 使用率和/或 I/O 等待时间,则在“r”列(等待运行时间的进程)中观察到任何恒定的非零数字是非常不寻常的。在下面的两个示例中,一个是针对未加载的系统,另一个是针对已加载的系统。
doug@s15:~/cse$ vmstat 10 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 99072 3302096 415420 7927960 0 0 2 9 4 0 2 0 98 0 0
0 0 99072 3302320 415420 7927960 0 0 0 4 68 160 0 0 100 0 0
0 0 99072 3302304 415420 7927960 0 0 0 9 62 132 0 0 100 0 0
0 0 99072 3302064 415420 7927960 0 0 0 0 63 138 0 0 100 0 0
0 0 99072 3302040 415420 7927960 0 0 0 12 66 155 0 0 100 0 0
0 0 99072 3302024 415420 7927960 0 0 0 16 90 150 1 0 99 0 0
0 0 99072 3302008 415420 7927960 0 0 0 6 61 131 0 0 100 0 0
0 0 99072 3301868 415424 7927960 0 0 0 5 72 167 0 0 100 0 0
0 0 99072 3301852 415432 7927956 0 0 0 13 66 145 0 0 100 0 0
0 0 99072 3301836 415432 7927960 0 0 0 12 63 133 0 0 100 0 0
doug@s15:~/temp$ vmstat 10 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
13 0 99072 1271288 415992 9952884 0 0 2 9 4 0 2 0 98 0 0
13 0 99072 1271304 415992 9952884 0 0 0 0 2670 1198 99 0 1 0 0
13 0 99072 1270932 415996 9952884 0 0 0 12 2696 1240 99 0 1 0 0
13 0 99072 1270916 415996 9952884 0 0 0 1 2662 1166 99 0 1 0 0
13 0 99072 1270800 416000 9952884 0 0 0 1 2666 1205 99 0 1 0 0
13 0 99072 1270636 416004 9952884 0 0 0 18 2720 1264 99 0 1 0 0
13 0 99072 1270644 416004 9952884 0 0 0 3 2670 1170 99 0 1 0 0
13 0 99072 1270520 416004 9952884 0 0 0 0 2673 1218 99 0 1 0 0
14 0 99072 1269116 416008 9952888 0 0 0 14 2692 1250 99 0 1 0 0
14 0 99072 1271140 416008 9952888 0 0 0 1 2662 1168 99 0 1 0 0
doug@s15:~/temp$ uptime
14:46:47 up 12 days, 22:23, 4 users, load average: 12.59, 12.15, 8.31
如果怀疑队列中存在某种挂起进程,请尝试以下方法识别:
ps -e -o state,pid,cmd | grep -v "ps -e -o" | grep ^R
示例(其中我有 3 个重型进程正在正确运行):
doug@s15:~/temp$ ps -e -o state,pid,cmd | grep -v "ps -e -o" | grep ^R
R 9827 ../c/consume 90.000000 50.000000 100.000000
R 9828 ../c/consume 90.000000 50.000000 100.000000
R 9829 ../c/consume 90.000000 50.000000 100.000000
执行该命令几次以帮助识别真正的罪魁祸首,因为很可能有虚假的真实进程正在运行。
最后要尝试的是查看整个线程列表以查找任何异常。示例:
doug@s15:~/ubuntu-help$ ps -e -o state,pid,cmd
S PID CMD
S 1 /sbin/init
S 2 [kthreadd]
...
S 17579 [kworker/u16:0]
R 17613 ps -e -o state,pid,cmd
S 22071 [kworker/0:0]
第一列中除“S”或“R”以外的任何内容都是值得关注的。也许可以使用以下方法过滤列表:
ps -e -o state,pid,cmd | grep -v ^S