Linux性能分析之cpu使用率过高

问题介绍

最近发现机器的cpu经常出现使用率非常的情况,程序本身逻辑比较简单,也不是cpu密集型和涉及大量计算
该机器未加入监控,这个时候就需要我们来一点点排查和分析问题所在

问题排查

查找cpu运行高的进程

  • 使用top查看进程的运行情况,发现机器的负载较高,进程数也非常多
  • 可以看到每个进程的cpu并不高,但是在发现程序运行时的进程较多
  • 程序其实非常简单,也没有什么cpu密集型的计算,这里我们就开始怀疑大量的进程发生了上下文的切换

分析是否有大量上下文切换

  • 通过pidstat -w 1 查看进程上下文切换次数
  • 如果没有可以执行yum install sysstat安装
  • cswch/snvcswch/s表示自愿上下文切换和非自愿上下文切换

那么什么是自愿上下文切换和非自愿上下文切换呢?

  • 自愿上下文切换:是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
  • 非自愿上下文切换:则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换


上图可以看出自愿上下文切换的次数是比较多的,也就表示进程所需要的资源不足

查看系统其它资源使用情况

  • 通过vmstat查看系统的内存、CPU 上下文切换以及中断次数
  • bi: 每秒读取的块数(读磁盘)
  • bo: 每秒写入的块数(写磁盘)
  • in:每秒的中断次数。
  • cs:每秒的上下文切换次数。
  • us: 用户进程执行消耗cpu时间, 值比较高时,说明用户进程消耗的cpu时间多
  • sy: 系统进程消耗cpu时间
  • wa: 等待IO时间, 值过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈

  • 从下图可以看到bo的量是比较大

分析io使用情况

  • 通过iostat -m 3查看硬盘的读写情况
  • 发现有大量的写入,可以看出由于大量的写盘操作导致上下文切换
  • 说明一下: 这里测试是用的ssd硬盘,正常情况下是非ssd硬盘

分析大量写io的进程

  • 通过iotop查看进程的io情况
  • 如没有iotop可以使用yum -y install iotop安装
  • 从下图看出每个进程都有大量的写盘操作


这里我们就可以去分析程序里什么地方有写盘动作,然后进行其优化

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器