一、平均负载定义
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,和CPU使用率没有直接关系。简单理解就是平均负载其实就是平均活跃进程数。
二、平均负载多少合理
平均负载最理想的情况是等于CPU个数。所以在评判平均负载时,首先你要知道系统有几个CPU,可以通过top命令或者从文件/proc/cpuinfo中读取。有了CPU个数,我们就可以判断出,当平均负载比CPU个数还大的时候,系统已经出现了过载。
平均负载有三个数值,分析系统负载趋势的时候,三个都要看。
(1)如果1分钟、5分钟、15分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
(2)如果1分钟的值远小于15分钟的值,就说明系统最近1分钟的负载在减少,而过去15分钟内有很大的负载。
(3)如果1分钟的值远大于15分钟的值,就说明最近1分钟的负载在增加,这种增加可能是临时的,也可能还会持续增加下去,所以需要持续观察。一旦1分钟的平均负载超过CPU的个数,就意味着正在发生过载的问题,这时就需要调查哪里出了问题,并想办法优化。
正常情况下,当平均负载高于CPU数量70%的时候,就要分析排查负载高的问题了。
三、平均负载与CPU使用率
CPU使用率跟平均负载不一定完全对应。比如:
(1)CPU密集型进程,使用大量CPU会导致平均负载升高,此时两者是一致的。
(2)I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高。
(3)大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会比较高。
四、平均负载案例分析
使用iostat、mpstat、pidstat等工具,找出平均负载升高的根源。
(1)mpstat是一个常用的多核CPU性能分析工具,用来实时查看每个CPU的性能指标以及所有CPU的平均指标。
(2)pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU、内存、I/O以及上下文切换等性能指标。
可以用uptime命令查看平均负载情况:
场景一:CPU密集型进程
使用stress命令模拟一个CPU使用率100%的场景:
接着在第二个终端运行uptime查看平均负载的变化情况:
最后在第三个终端运行mpstat查看CPU使用率的变化情况:
从终端二中可以看到,1分钟的平均负载会慢慢增加到1.00,二从终端三可以看到有个CPU的使用率是100%,但是他的iowait只有0.说明平均负载的升高正是由于CPU使用率为100%。
那么是哪个进程导致了CPU使用率为100%呢?可以使用pidstat来查询:
可以看到stress进程的CPU使用率为100%。
场景二:I/O密集型进程
运行stress命令,模拟I/O压力:
在第二个终端运行uptime查看平均负载的变化情况:
然后在第三个终端运行mpstat查看CPU使用率的变化情况:
可以看出,1分钟的平均负载慢慢增加到1.06,其中一个CPU的使用率达到23.87,而iowait高达67.53%。这说明,平均负载的升高是由于iowait的升高。
用pidstat查询下哪个进程导致了iowait这么高:
可以发现,还是stress进程导致的。
场景三:大量进程的场景
当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程。
用stress模拟8个进程
接着运行pidstat来看一下进程的情况:
可以看出8个进程在争抢2个CPU,每个进程等待CPU的时间高达75%(%wait),从而导致CPU过载。
小结
平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,不能直接发现瓶颈在哪里。所有理解平均负载时也要注意:
(1)平均负载高有可能时CPU密集型进程导致的;
(2)平均负载高不一定代表CPU使用率高,有可能时I/O更繁忙了;
(3)当发现负载高的时候,可以使用mpstat、pidstat等工具,辅助分析负载的来源