服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux系统下CPU性能问题分析案例

Linux系统下CPU性能问题分析案例

2023-12-05 17:03未知服务器之家 Linux

关于CPU使用率相关重要指标,我们经常在使用top、dstat、vmstat等工具看到,这里解读一下: user(通常缩写为us),代表用户态CPU时间。 nice(通常缩写为ni),代表低优先级用户态CPU时间,nice可取值范围是-20到19,数值越大,优先级

Linux系统下CPU性能问题分析案例

关于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 的使用情况

Linux系统下CPU性能问题分析案例

  • 结果分析。
  • 在iowait升高(wai)时,磁盘的读请求(read)都很高,最高时1271M。
  • 充分说明iowait的升高是磁盘I/O导致的,确切的说,是大量读磁盘导致的。

2、通过pidstat查询进程的I/O情况

# -d:统计进程的磁盘使用情况 1: 采集周期1s  10: 采集10次
pidstat -d 1 10

Linux系统下CPU性能问题分析案例

  • 结果分析。
  • 大量读磁盘的进程名称是app,而且app进程的pid在不停变化(短时进程?)

3、使用ps命令查看下app进程

Linux系统下CPU性能问题分析案例

  • 结果分析。
  • 进程的状态是Z+,命令行参数<defunct>,进程变成僵尸进程了。
  • 僵尸进程的产生和处理方法,这里暂不展开,有想了解的可以评论留言或者自行学习。
  • app的是谁创建的,是下一步分析的重点。

4、查询app进程的父进程

Linux系统下CPU性能问题分析案例

  • 结果分析。
  • pid为51780的父进程id是51688,进程名称也是app。

5、使用perf命令采集性能事件分析app函数调用

# 录制全局性能事件,如果只想录制某个进程的,可以使用-p指定
# perf record -ag -p {pid} -- sleep 10 #采集指定pid所有cpu的性能事件,周期是10s
perf record -g

# 分析报告
perf report

Linux系统下CPU性能问题分析案例

  • 分析结果。
  • 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进程回收后也会消亡。

延伸 · 阅读

精彩推荐