系统设计和应用编程中,常常要进行性能优化或负载问题排查,一般涉及到系统或进程的CPU使用率。CPU使用率可以反应系统的负载,也可以反应各个进程的具体情况。为了发现问题或调试程序,就有必要监控系统的CPU使用率。Linux系统中CPU使用率的监控工具有vmstat、mpstat、ps、top等。
1. CPU使用率监控工具
CPU使用率的主要监控工具有:
vmstat
mpstat(top+1类似)
ps(top+P类似)
vmstat工具可以大概知道系统的CPU使用率。mpstat工具则能显示每一个核的CPU使用率,或者进入top后再按数字1也可以显示每个核的CPU使用率。top或ps工具来细化到每一个进程的CPU使用率。
2. CPU使用率监控示例
每隔一秒显示系统的概况,包括CPU的使用率:
[nano: /home/luojianh ]$
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
8 1 0 2563344 467536 7745908 0 0 5 35 2 6 3 20 77 0 0
7 0 0 2564116 467576 7747912 0 0 2036 632 6620 437995 30 51 17 2 0
2 1 0 2589984 467632 7749200 0 0 408 0 3680 469111 24 58 17 2 0
8 0 0 2557996 467648 7750060 0 0 160 0 2187 480338 28 54 14 3 0
显示所有核的CPU使用率:
[nano: /home/luojianh ]$
mpstat -P ALL
Linux 2.6.18-194.17.4.el5PAE (nano) 03/14/2012 _i686_ (16 CPU)
10:52:23 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:52:24 AM all 2.24 0.00 3.62 1.93 0.00 0.06 0.00 0.00 92.14
10:52:24 AM 0 29.00 0.00 12.00 31.00 0.00 0.00 0.00 0.00 28.00
10:52:24 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:52:24 AM 2 0.99 0.00 3.96 0.00 0.00 0.00 0.00 0.00 95.05
10:52:24 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:52:24 AM 4 0.00 0.00 4.04 0.00 0.00 0.00 0.00 0.00 95.96
10:52:24 AM 5 3.96 0.00 6.93 0.00 0.00 0.00 0.00 0.00 89.11
10:52:24 AM 6 1.00 0.00 7.00 0.00 0.00 0.00 0.00 0.00 92.00
10:52:24 AM 7 0.00 0.00 7.00 0.00 0.00 0.00 0.00 0.00 93.00
10:52:24 AM 8 0.00 0.00 3.00 0.00 0.00 0.00 0.00 0.00 97.00
10:52:24 AM 9 0.00 0.00 7.00 0.00 0.00 0.00 0.00 0.00 93.00
10:52:24 AM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:52:24 AM 11 0.99 0.00 2.97 0.00 0.00 0.00 0.00 0.00 96.04
10:52:24 AM 12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:52:24 AM 13 0.00 0.00 3.96 0.00 0.00 0.00 0.00 0.00 96.04
10:52:24 AM 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:52:24 AM 15 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 99.00
显示前5位CPU占用的进程:
$ ps aux | sort -r -k 3 | head -6
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 11691 1.6 0.5 17364 11m ? S Mar11 64:01.01 pm_client
root 10079 0.3 2.7 601m 67m ? S Mar11 22:45.17 monitorAgent
root 10722 0.3 0.5 19416 11m ? S Mar11 13:37.11 sysmtc
root 7392 0.3 0.1 31140 3044 ? S Mar11 0:01.18 solid
root 1 0.0 0.0 2132 748 ? S Mar11 0:35.81 [init]
或者利用top自动按CPU占用率排名的特点,假设前面有7行信息:
$ top -d 1 -n 1 | head -13 | tail -6
11:46:11 up 3 days, 19:13, 1 user, load average: 1.72, 1.87, 1.80
176 processes: 174 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 12.8% 0.0% 4.6% 0.2% 0.2% 18.7% 63.2%
Mem: 2055244k av, 2032692k used, 22552k free, 0k shrd, 18256k buff
1216212k actv, 513216k in_d, 25520k in_c
Swap: 4192956k av, 249844k used, 3943112k free 1218304k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14939 mysql 25 0 379M 224M 1117 R 38.2 25.7% 15:17.78 mysqld
4023 root 15 0 2120 972 784 R 2.0 0.3 0:00.06 top
1 root 15 0 2008 688 592 S 0.0 0.2 0:01.30 init
2 root 34 19 0 0 0 S 0.0 0.0 0:22.59 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
3. CPU使用率监控脚本
用上面的命令连续监控系统的详细CPU使用状况,shell脚本如下:
LOG_FILE=/tmp/cpu_status.log
echo "CPU status of system and some processes" >> "${LOG_FILE}"
while true; do
date >> "${LOG_FILE}"
vmstat 1 1 >> "${LOG_FILE}"
mpstat -P ALL 1 1 >> "${LOG_FILE}"
ps aux | sort -r -k 3 | head -6 >> "${LOG_FILE}"
sleep 10
done