12.1.3 CPU监控
在Linux系统中监控CPU的性能主要关注3个指标:运行队列、CPU使用率和上下文切换,理解这3个指标的概念和原理对于发现和处理CPU性能问题有很大的帮助。
1.运行队列
每个CPU都会维护一个运行队列,调度器会不断地轮循让队列中的进程运行,直到进程运行完毕将其由队列中删除。如果CPU过载,就会出现调度器跟不上系统要求,导致运行队列中等待运行的进程越来越多。正常来说,每个CPU的运行队列不要超过3,如果是双核CPU就不要超过6。
2.CPU使用率
CPU使用率一般可以分为以下几部分。
q 用户进程:运行用户进程所占用的CPU时间百分比。
q 系统进程:运行系统进程和中断所占用的CPU时间百分比。
q 等待IO:因为IO等待而使CPU处于idle状态的时间百分比。
q 空闲:CPU处于空闲状态的时间百分比。
如果CPU的空闲率长期低于10%,那么表示CPU的资源已经非常紧张,应该考虑进行优化或者添加更多的CPU。“等待IO”表示CPU因等待IO资源而被迫处于空闲状态,这时候的CPU并没有处于运算状态,而是被白白浪费了,所以“等待IO”应该越小越好。
3.上下文切换
通过CPU时间轮循的方法,Linux能够支持多任务同时运行。对于普通的CPU,内核会调度和执行这些进程,每个进程都会被分配CPU时间片并运行。当一个进程用完时间片或者被更高优先级的进程抢占时间块后,它会被转到CPU的等待运行队列中,同时让其他进程在CPU上运行。这个进程切换的过程被称作上下文切换。过多的上下文切换会造成系统很大的开销。在日常维护工作中,也可以通过vmstat命令对CPU资源进行监控。
# vmstat 5
procs ----memory---- ---swap-- ----io---- --system-- ---------cpu----------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 2 808788 193147 78936 941420 307 0 21745 1005 1189 2590 34 6 12 48 0
0 2 808788 162212 78893 978920 95 0 12107 0 1801 2633 2 12 3 84 0
1 2 809268 88756 78717 1061424 130 28 18377 113 1142 1694 3 5 3 88 0
1 2 826284 17608 71240 1144180 100 2380 25839 16380 1528 1179 19 9 12 61 0
2 1 854780 17688 34140 1208980 1 3108 25557 30967 1764 2238 43 13 16 28 0
所有需要监控的CPU指标都能从该命令的输出结果中获取,其中各列说明如下所示。
q r:在运行队列中等待的进程数。
q b:在等待IO的进程数。
q cs:每秒的上下文切换的次数。
q us:用户进程使用的CPU时间(%)。
q sy:系统进程使用的CPU时间(%)。
q id:CPU空闲时间(%)。
q wa:等待IO所消耗的CPU时间(%)。
由上面的命令输出中可以看到:
q IO等待的CPU时间(wa)非常高,而实际运行用户和系统进程的CPU时间却 不高。
q 存在等待IO的进程(b>0)。
由此可以得出结论:系统目前CPU使用率高是由于IO等待所造成的,并非由于CPU资源不足。用户应检查系统中正在进行IO操作的进程,并进行调整和优化。
vmstat命令只能显示CPU总的性能情况,对于有多个CPU的计算机,如果要查看每个CPU的性能情况,可以使用mpstat命令,如下所示。
# mpstat 2
Linux 2.6.18-92.el5 (demoserver) 2008年09月08日
16时41分35秒 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
16时41分37秒 all 2.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 1009.00
16时41分39秒 all 4.00 0.00 0.50 0.00 0.00 0.00 0.00 95.50 1036.00
16时41分41秒 all 4.98 0.00 0.50 0.00 0.00 0.00 0.00 94.53 1002.49
16时41分43秒 all 1.00 0.00 0.50 0.00 0.00 0.00 0.00 98.51 1003.48
16时41分45秒 all 6.57 0.00 1.52 0.00 0.51 1.01 0.00 90.40 1881.31
16时41分47秒 all 14.85 0.00 3.96 0.50 0.50 2.48 0.00 77.72 4025.25
16时41分49秒 all 20.10 0.00 5.03 0.00 0.50 2.51 0.00 71.86 3460.30
16时41分51秒 all 24.50 0.00 5.00 0.00 0.50 2.00 0.00 68.00 3653.50
16时41分53秒 all 33.17 0.00 7.54 14.07 0.50 3.02 0.00 41.71 3465.33
命令输出结果中各字段的说明如下所示。
q CPU:CPU号码。
q %user:运行用户进程所占用的CPU时间(%)。
q %nice:用户进程的nice操作所占用的CPU时间(%)。
q %sys:运行系统进程所占用的CPU时间(%)。
q %iowait:等待io所消耗的cpu时间(%)。
q %irq:硬中断所占用的CPU时间(%)。
q %soft:软中断所占用的CPU时间(%)。
q %steal:虚拟设备所占用的CPU时间(%)。
q %idle:cpu空闲时间(%)。
q intr/s:每秒钟处理的中断次数(次/秒)。
例如,上述输出结果中的最后一条记录表示运行用户进程所占用的CPU时间为33.17%;用户进程的nice操作所占用的CPU时间为0%;运行系统进程所占用的CPU时间为7.54%;等待IO所消耗的CPU时间为14.07%;硬中断所占用的CPU时间为0.50%;软中断所占用的CPU时间为3.02%;虚拟设备所占用的CPU时间为0.00%;CPU空闲时间为41.71%;每秒钟处理的中断次数为每秒3465.33次。