Shell脚本编程——CPU使用率的监控

2019-07-12 23:48发布

    系统设计和应用编程中,常常要进行性能优化或负载问题排查,一般涉及到系统或进程的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