一般我们排查系统变慢的问题时候,会执行uptime或者top命令,来查看操作系统的负载:
1 2 3 4 5 6 |
$ uptime 21:13:31 up 23 min, 1 users, load average: 0.52, 0.58, 0.59 $ top top - 21:13:31 up 23 min, 1 users, load average: 0.52, 0.58, 0.59 ... |
uptime和top命令的第一行输出都是一样的,分别是系统当前时间、系统已经运行的时间、当前登录用户数以及系统平均负载。而系统平均负载又分为三个数值,分别表示系统过去1分钟、5分钟、15分钟的平均负载。
含义
那么平均负载到底代表什么呢?我们使用man uptime
命令查看一下:
1 2 3 4 5 |
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the num‐ ber of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time. |
官方解释指出,系统平均负载就是单位时间内系统中处于runnable和uninterruptable状态的平均进程数。
runnable状态
可运行状态,指这个进程正在使用cpu或者在等待cpu,我们使用ps命令看到的处于R状态的进程。
uninterruptable状态
不可中断状态,指这个进程正处于内核态关键流程,不可被中断,最常见的就是处于等待I/O状态,我们使用ps命令看到的处于D状态的进程。
为了便于系统快速计算,实际上平均负载是活跃进程数的指数衰减平均值,我们可以简单理解为,平均负载其实就是平均活跃进程数。系统平均负载并没有对系统的cpu个数进行归一化,所以和CPU使用率并没有直接关系。
如果系统平均负载是2,意味着:
在1个cpu的系统中,有一半的进程竞争不到cpu
在2个cpu的系统中,所有的cpu刚好被占用
在4个cpu的系统中,cpu有50%的空闲
如何分析
所以,我们不能光凭系统平均负载就来判断系统的是否负载过高或者过低。首先我们需要知道有几个cpu:
1
|
$ grep 'model name' /proc/cpuinfo | wc -l |
平均负载最理想的情况就是正好等于CPU个数,当平均负载比CPU个数大时,系统就出现了过载。之后,我们就可以通过分析1分钟、5分钟、15分钟的平均负载,来了解当前系统的负载变化趋势。
使用平均负载超过或者低于CPU数量多少作为依据,来判断系统平均负载是否正常,参考价值不大。最好的方法是监控正常状态下的系统平均负载,根据历史数据来判断当前负载是否正常,如果不正常,再通过其他相关的分析程序来分析原因。
和CPU使用率关系
系统平均负载和CPU使用率没有直接的关系,系统平均负载不仅包括了正在使用CPU的程序,还包括了等待CPU和等待I/O的程序。而CPU使用率是单位时间内CPU繁忙状况的统计,对于不同类型的程序,和平均负载的不一定完全对应:
CPU密集型
CPU大量时间都在运行,一般平均负载会升高,CPU使用率也会升高
I/O密集型
大量等待I/O也会导致平均负载升高,但是CPU使用率不一定高
此外,如果有大量等待CPU调度的进程,也会导致平均负载升高,同时CPU使用率也会升高。