关于CPU使用率相关重要指标,我们经常在使用top、dstat、vmstat等工具看到,这里解读一下:
- user(通常缩写为us),代表用户态CPU时间。
- nice(通常缩写为ni),代表低优先级用户态CPU时间,nice可取值范围是-20到19,数值越大,优先级反而越低,默认值是0。
- system(通常缩写为sys),代表内核态CPU时间。
- idle(通常缩写为id),代表空闲时间。注意,它不包括等待I/O的时间(iowAIt)。
- iowait(通常缩写为wa),代表等待 I/O的CPU时间。
- irq(通常缩写为hi),代表处理硬中断的CPU时间。
- softirq(通常缩写为si),代表处理软中断的CPU时间。
- steal(通常缩写为st),代表当系统运行在虚拟机中的时候,虚拟机占用的CPU时间。
- guest(通常缩写为guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间。
- guest_nice(通常缩写为gnice),代表以低优先级运行虚拟机的时间。
CPU的iowait突然升高,我该怎么处理?
分析过程
从上面的介绍可以看出,iowait升高,第一反应会想到查看系统的 I/O情况,I/O又分为磁盘I/O和网络I/O,这里先分析磁盘I/O。
1、运行 dstat 命令,观察 CPU 和 I/O 的使用情况
- 结果分析。
- 在iowait升高(wai)时,磁盘的读请求(read)都很高,最高时1271M。
- 充分说明iowait的升高是磁盘I/O导致的,确切的说,是大量读磁盘导致的。
2、通过pidstat查询进程的I/O情况
# -d:统计进程的磁盘使用情况 1: 采集周期1s 10: 采集10次
pidstat -d 1 10
- 结果分析。
- 大量读磁盘的进程名称是App,而且app进程的pid在不停变化(短时进程?)
3、使用ps命令查看下app进程
- 结果分析。
- 进程的状态是Z+,命令行参数<defunct>,进程变成僵尸进程了。
- 僵尸进程的产生和处理方法,这里暂不展开,有想了解的可以评论留言或者自行学习。
- app的是谁创建的,是下一步分析的重点。
4、查询app进程的父进程
- 结果分析。
- pid为51780的父进程id是51688,进程名称也是app。
5、使用perf命令采集性能事件分析app函数调用
# 录制全局性能事件,如果只想录制某个进程的,可以使用-p指定
# perf record -ag -p {pid} -- sleep 10 #采集指定pid所有cpu的性能事件,周期是10s
perf record -g
# 分析报告
perf report
- 分析结果。
- app进程正在对磁盘进行直接读,也就是绕过了系统缓存,每个读请求都会从磁盘直接读。
思路总结
- 使用dstat命令查看系统I/O情况(dstat可以同时观察cpu和磁盘的情况)。
- 使用pidstat命令可以定位到进程维度的磁盘读写情况,找出可疑进程。
- 使用ps、top等命令可以观测到进程的状态(D、R、S、Z、T等)。
- 使用pstree命令我们找出了app进程的父进程(子进程的pid一直在变)。
- 使用perf命令就可以对进程的函数调用关系分析了。
- 没啥需要使用的啦。哈哈,点赞+收藏。
知识补充
进程状态
- R 是Running或Runnable 的缩写,表示进程在CPU的就绪队列中,正在运行或者正在等待运行。
- D 是Disk Sleep的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
- Z 是Zombie的缩写,进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
- S 是Interruptible Sleep的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入R状态。
- I 是Idle的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。
- T 或者 t,也就是Stopped或Traced的缩写,表示进程处于暂停或者跟踪状态。
僵尸进程
- 一旦父进程没有处理子进程的终止,还一直保持运行状态,那么子进程就会一直处于僵尸状态。
- 大量的僵尸进程会用尽PID进程号,导致新进程不能创建。
- 僵尸进程在父进程回收它的资源后就会消亡,或者在父进程退出后,由init进程回收后也会消亡。
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。