一、对CPU密集型进程进行模拟,具体如下:

  第一个终端
    在第一个终端运行 stress 命令,模拟一个 CPU 使用率 100% 的场景:stress --cpu 1 -- timeout 600

    CPU平均负载率之stress模拟CPU密集型进程_数据


  第二个终端
    运行 uptime 查看系统平均负载情况,watch -d 参数表示高亮显示变化的区域:watch -d uptime

    CPU平均负载率之stress模拟CPU密集型进程_数据_02

    1 分钟的平均负载会慢慢增加到 1以上。

  第三个终端

    运行 mpstat 查看 CPU 使用率的变化情况:mpstat -P ALL 5 (-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据

    CPU平均负载率之stress模拟CPU密集型进程_高亮显示_03

     仅有一个 CPU 的使用率接近 100%,但它的 iowait 只有 0,这说明,平均负载的升高正是由于 CPU 使用率为 100%。

  二、分析具体导致CPU使用率这么高的进程

    通过模拟,我们知道导致CPU使用率这么高的进程就是stress,但是在实际生产中就得通过pidstat工具进行查询了。下面就利用该工具进行查询过程的解析:

    首先简述下pidstat的选项功能:

      # pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
      # -u:默认的参数,显示各个进程的cpu使用统计
      # -r:显示各个进程的内存使用统计
      # -d:显示各个进程的IO使用情况
      # -p:指定进程号
      # -w:显示每个进程的上下文切换情况
      # -t:显示选择任务的线程的统计信息外的额外信息

    详细功能通过man pidstat可以查阅:

      CPU平均负载率之stress模拟CPU密集型进程_工具集_04

    本案例中使用pidstat 5 1

      CPU平均负载率之stress模拟CPU密集型进程_高亮显示_05

    通过上图可以分析出CPU使用%98以上的是pid=5870的命令stress。

 

  综合上述,通过sysstat工具集,可以明确分析出CPU密集型进程导致CPU平均负载率处于高水位线的“罪魁祸首”。 同理操作可以分析出其他类型导致CPU平均负载率高的进程。如下模拟大量进程导致的CPU平均负载率过高:

  首先查看CPU个数:lscpu

    CPU平均负载率之stress模拟CPU密集型进程_高亮显示_06

   第一个终端:stress -c 8 --timeout 600

    CPU平均负载率之stress模拟CPU密集型进程_数据_07

  第二个终端:watch -d uptime
    CPU平均负载率之stress模拟CPU密集型进程_高亮显示_08

  第三个终端:pidstat -u 5 1

    CPU平均负载率之stress模拟CPU密集型进程_高亮显示_09

     可以看出,8 个进程在争抢 2 CPU,每个进程等待CPU 的时间(也就是代码块中的 %wait 列)高达 75%这些超出 CPU 计算能力的进程,最终导致 CPU 过载。