本章主要讲解如何理解CPU的平均负载、以及常见的引起CPU平均负载升高的几种场景。
什么是CPU的平均负载
指单位时间内系统可运行(Runnable)以及不可中断(Uninterruptible Sleep)的平均进程数。其中不可中断是指系统对进程和设备的一种保护,比如读磁盘的文件为了保证系统的一致性这个进程不可中断 ps命令中是D
如何查看平均负载呢:
常用命令有:uptime|top|w,我们1以uptime为例,如:
1 | uptime |
其中:load average: 0.63, 0.83, 0.88 分别代表了最近1分钟、5分钟、15分钟的cpu平均负载,什么是laod avarage呢
平均负载反映了这段时间操作系统的CPU负载的趋势,一般来讲,一个健康的系统的平均负载不应该超过0.7。
引起平均负载升高的常见的三种场景
和平均负载相关的另一项数据是CPU的使用率,他们俩的关系根据场景有如下的联系
- 计算密集型:cpu使用率和cpu负载会同时升高
- I/O密集型:大量的线程处于i/o-wait,这时候cpu负载高但是cpu使用率并不高
当需要调度的进程数量大于cpu的时候,cpu负载和使用率会同时升高。
我们怎么确定上述的3中场景呢?这时候我们可以用到如下的工具:
- stress 压测工具
- sysstat linux性能分析工具,常用mpstat和pidstat
模拟计算密集型
见下图:
mpstat的结果显示这时候看%iowait不高,但是%user已经100%了
pidstat的结果显示是stress引起的
1 | stress --cpu 1 --timeout 600 #一个核打满 |
模拟IO密集型
见下图:
mpstat的结果显示这时候看%iowait很高67.53,但是%user才0.43
pidstat的结果显示是stress引起的
1 | 发送sync |
大量CPU调度
pidstat的结果显示%wait的结果很高,%iowait和cpu都不高
1 | 发送sync |
总结
- 计算密集型:mpstat如果%user很高,但是%iowait不高,再用pidstat查看进程的%wait如果也不高。
- I/O密集型:mpstat如果%user不高,但是%iowait很高,再用pidstat查看进程的%wait如果也不高。
- 大量的进程需要调度:mpstat如果%user不高,但是%iowait不高,再用pidstat查看进程的%wait如果很高。