Linux系统下CPU性能问题分析案例(上)
创始人
2025-07-08 03:30:34
0

关于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+,命令行参数,进程变成僵尸进程了。
  • 僵尸进程的产生和处理方法,这里暂不展开,有想了解的可以评论留言或者自行学习。
  • 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进程回收后也会消亡。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...