CPU性能监控
CPU性能理解
要理解CPU的性能,就必须理解CPU做了哪些事情
工作时间:CPU就是一个执行者,他维护着一个可运行队列,每时每刻都会有进程(线程)在上面运行,进程的运行时间就是CPU的工作时间
中断时间(Interrupt Number):CPU需要知道什么时间运行什么进程,这需要CPU和进程调度器协商沟通,进程调度器告诉CPU到底运行哪个进程,什么时候停止运行等待其它资源,进程由运行状态切换到等待状态花费的时间就是中断时间
中断优先级(硬件中断>内核中断>用户中断)
上下文切换时间(context switch):A进程运行时间已经到了,现在CPU需要切换到B进程,由A进程切换到B进程花费的时间就是上下文切换时间
利用率: us (user cpu time):用户进程占用CPU花费时间的百分比
sy(system cpu time):内核, 中断占用CPU花费时间百分比
CPU的性能指标:利用率,上下文切换次数,中断次数,运行队列等指标来监控cpu性能
vmstat
vmstat 是个查看系统整体性能的小工具,小巧、即使在很heavy的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据
2: 表示每隔2s
[li.sun@d114-app-06 ~]$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 16963800 3440 8607132 0 0 5 8 8 4 2 0 98 0 0
0 0 0 16964188 3440 8607132 0 0 0 4 2601 2123 0 0 100 0 0
0 0 0 16964372 3440 8607132 0 0 0 2 3695 3146 1 0 99 0 0
r (running): 可运行的队列
b (blocked): 阻塞的进程数,过多说明系统IO速度有问题
in (interrupt number): 中断的次数,中的次数越多说明cpu不停的需要请求资源
cs(contenxt switch): 上下文切换的次数 上下文过多,说明进程数量过多
us(user cpu time): 用户进程的cpu利用率
sy(system cpu time): 内核进程的cpu利用率
wa(io wait): 当可运行的进程因为等待io而处于blokced状态,这个时间所占的比例
id(idle): cpu完全空闲的时间的比例
具体实例分析
系统的某个时间段,cpu的利用率很高,排查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
4 0 140 2915476 341288 3951700 0 0 0 0 1057 523 19 81 0 0 0
4 0 140 2915724 341296 3951700 0 0 0 0 1048 546 19 81 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1044 514 18 82 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 24 1044 564 20 80 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1060 546 18 82 0 0 0
interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源; system time(sy)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU(不断请求资源); run queue(r)刚好在4个
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
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
上面的数据可以看出几点:
context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程; 进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call); run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内
mpstat
mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据,下面的输出显示 CPU1 和 CPU2 基本上没有派上用场,系统有足够的能力处理更多的任务。
Linux 3.10.0-123.el7.x86_64 (d114-app-06) 05/12/2016 _x86_64_ (24 CPU)
02:55:54 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:55:54 PM all 2.10 0.04 0.19 0.01 0.00 0.02 0.00 0.00 0.00 97.63
02:55:54 PM 0 3.67 0.04 0.37 0.01 0.00 0.06 0.00 0.00 0.00 95.85
%user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100
%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
%sys 在internal时间段里,内核时间(%) (system/total)*100
%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq 在internal时间段里,硬中断时间(%) (irq/total)*100
%soft 在internal时间段里,软中断时间(%) (softirq/total)*100
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100
ps
如果发现某个进程特别占有cpu,查看某个进程的cpu利用情况
li.sun@xg-ppe-web:~$ ps aux | grep hhvm
www-data 4113 0.3 2.9 1033992 238096 ? Ssl 14:32 0:06 /usr/bin/hhvm --config /etc/hhvm/php.ini
USER: 执行进程的用户
PID: 进程ID
%CPU: CPU的利用率
%MEMER: 内存的使用率
VSZ: 虚拟内存的使用情况(kb)
RSS: 该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令