linux系统基础 每次我们发现系统变慢或者监控发现CPU有异常飚高,都会使用linux系统命令查看,比如top,uptime,等命令,了解当时系统负载情况; $uptime 10:43:42 up 124 days, 19:22, 16 users, load average: 0.22, 0.13, 0.14 /当前时间 /运行时间 /登录用户数 比如uptime,上面每一个输出的含义,后面三个一次是1分钟、5分钟、15分钟的平均负载 那么问题来了,0.22到底代表的是什么?是单位时间内的CPU使用率? 我们可以使用man uptime 了解平均负载的详细解释;

**平均负载**
单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数;和CPU使用率并没有直接关系


可运行状态的进程,是指正在使用CPU或者正在等待CPU的进程,也就是ps命令看到的处于R状态的进程

不可中断状态的进程是正处于内核态关键流程的进程,比如最常见的是等待硬件设备的I/O响应, 也就是ps命令中看到的D状态的进程;
因此可简单理解为,平均负载其实就是平均活跃进程数,单位时间内的活跃进程数;
例子:当平均负载为2时,意味着什么?
  • 在只有2个CPU的系统上,意味着所有的CPU都刚好被完全占用
  • 在4个CPU的系统行,意味着CPU有50%的空闲
  • 而在只有一个CPU的系统中,则有一半的进程竞争不到CPU

那么平均负载多少比较合理? 平均负载最理想的状态是等于系统CPU个数(逻辑核数) 当平均负载高于CPU数量70%的时候就应该关注;

实际排查中,我们肯定不会只用uptime看平均负载,会结合很多其他性能命令一起排查,比如dstat,pidstat,top,iowait,iostat等;

平均负载于CPU使用率 在学习文章之前我经常混淆这两个概念,load和idle到底该看那个,是不是load高,idle就一定低? 在回到上面的平均负载,单位时间内,处于可运行状态和不可中断状态的进程数,因此,它不仅包括正在使用的CPU的进程还包括等待CPU和等待I/O的进程; 而CPU使用率:单位时间内CPU繁忙情况的统计,跟平均负载不一定完全对应。比如:

  • CPU密集型进程,使用大量CPU会平均负载高,CPU使用率繁忙,此时这两者是一致的 *** I/O密集型进程,等待I/O会导致平均负载高,但CPU使用率不一定高**
  • 大量等待CPU的进程会导致平均负载高,此时CPU使用率也会高

所以主要差别是I/O密集型,I/O等待会导致平均负载高,但不一定会导致CPU使用率高,这时候就可以结合其他命令查看,最通用的是先使用pidstat 确认是idle还是IO问题,再用pidstat确认具体进程。

具体演示例子可自行设计。

学习资料地址:https://time.geekbang.org/column/article/69618