vmstat
命令可以用来监控CPU
的使用状况。举例如下:
# vmstat 1
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 0 5201924 1328 5578060 0 0 0 0 1582 6952 2 1 98 0 0
1 0 0 5200984 1328 5577996 0 0 0 0 2020 20567 9 1 90 0 0
0 0 0 5198668 1328 5577952 0 0 0 0 1568 7617 5 1 94 0 0
0 0 0 5194844 1328 5578000 0 0 0 187 1249 7057 1 1 98 0 0
0 0 0 5199956 1328 5578232 0 0 0 0 1496 7306 4 1 95 0 0
上述命令每隔1
秒输出系统状态,最后5
列是描述的是CPU
状况。man
手册上关于这5
列的含义描述的很清楚:
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
vmstat
实质上是从/proc/stat
文件获得系统状态:
# cat /proc/stat
cpu 381584 711 299364 1398303520 429839 0 251 0 0 0
cpu0 90740 58 44641 174627550 131209 0 120 0 0 0
cpu1 43141 26 22925 174746812 108219 0 10 0 0 0
cpu2 41308 35 25097 174831161 25877 0 40 0 0 0
cpu3 39301 70 27514 174836084 27792 0 4 0 0 0
cpu4 39187 78 46191 174750027 109013 0 0 0 0 0
......
需要注意的是这里数字的单位是Jiffies
。
另外,vmstat
计算CPU
时间百分比使用的是“四舍五入”算法(vmstat.c
):
static void new_format(void){
......
duse = *cpu_use + *cpu_nic;
dsys = *cpu_sys + *cpu_xxx + *cpu_yyy;
didl = *cpu_idl;
diow = *cpu_iow;
dstl = *cpu_zzz;
Div = duse + dsys + didl + diow + dstl;
if (!Div) Div = 1, didl = 1;
divo2 = Div / 2UL;
printf(w_option ? wide_format : format,
running, blocked,
unitConvert(kb_swap_used), unitConvert(kb_main_free),
unitConvert(a_option?kb_inactive:kb_main_buffers),
unitConvert(a_option?kb_active:kb_main_cached),
(unsigned)( (unitConvert(*pswpin * kb_per_page) * hz + divo2) / Div ),
(unsigned)( (unitConvert(*pswpout * kb_per_page) * hz + divo2) / Div ),
(unsigned)( (*pgpgin * hz + divo2) / Div ),
(unsigned)( (*pgpgout * hz + divo2) / Div ),
(unsigned)( (*intr * hz + divo2) / Div ),
(unsigned)( (*ctxt * hz + divo2) / Div ),
(unsigned)( (100*duse + divo2) / Div ),
(unsigned)( (100*dsys + divo2) / Div ),
(unsigned)( (100*didl + divo2) / Div ),
(unsigned)( (100*diow + divo2) / Div ),
(unsigned)( (100*dstl + divo2) / Div )
);
......
}
所以会出现CPU
利用百分比相加大于100
的情况:2 + 1 + 98 = 101
。
另外,在Linux
系统上,r
字段表示的是当前正在运行和等待运行的task
的总和。
参考资料:
/proc/stat explained;
procps。