load average 的含义
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。和 CPU 使用率并没有直接的关系
一般的进程需要消耗 CPU、内存、磁盘I/O、网络I/O等资源,在这种情况下,平均负载就不是单独指的CPU使用情况。即内存、磁盘、网络等因素也可以影响系统的平均负载值。不过影响最大的是 CPU 使用率、CPU 等待和磁盘I/O。
一个机器的负载情况通常是通过 CPU 核数来判断的。当平均负载比 CPU 核数还大的时候,系统已经出现了过载。
如在单核处理器中,平均负载值为 1 或者小于 1 的时候,系统处理进程会非常轻松,即负载很低。当达到 3 的时候,就会显得很忙,达到 5 或者 8 的时候就不能很好的处理进程了(其中 5 和 8 目前还是个争议的阈值,为了保守起见,建议选择低的)。
查看load average 数据
下面几个命令都可以看到 load average
1 | # top |
截图如下:
top 命令:
uptime 命令:
w 命令:
这里的 load average 的三个值分别指系统在最后 1/5/15 分钟 的平均负载值。
根据经验:我们应该把重点放在5/15分钟的平均负载,因为 1 分钟的平均负载太频繁,一瞬间的高并发就会导致该值的大幅度改变。
平均负载与 CPU 使用率
在日常使用中,我们经常容易把平均负载和 CPU 使用率混淆,这里我们做下区分。
可能我们会有疑惑,既然平均负载代表的是活跃进程数,那么平均负载高了,不就意味着 CPU 使用率高了吗?
这里我们还得回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,他不仅包扩了正在使用CPU的进程,还包括等待 CPU 和等待磁盘I/O的进程。
而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,和平均负载并不一定完全对应。比如:
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的。
- I/O 密集型进程, 等待 I/O 也会导致平均负载升高,但是 CPU 使用率不一定很高。
- 大量等待CPU的进程调用也会导致平均负载升高,此时的 CPU 使用率也会比较高。
平均负载案例分析
机器是一个 16 核 CPU 的。
这里会用到 2 个工具,stress 和 sysstat。
stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
sysstat 是一个 Linux 性能工具,用来监控和分析系统的性能,以下案例中会用到这个包的 2 个命令 mpstat 和 pidstat。
- mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
- pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。
场景1:CPU密集型进程
我们打开终端一运行 stree 命令,模拟一个 CPU 使用率 100% 的场景
1 | [root@localhost ~]# stress --cpu 1 --timeout 600 |
我们打开终端二,查看 CPU 负载的上升状态
1 | [root@localhost ~]# uptime |
打开终端三,查看 CPU 使用状态
1 | [root@localhost ~]# mpstat -P ALL 5 |
从终端二中可以看到,1 分钟的平均负载慢慢会增加到 1;而从终端三中可以看到,正好有一个 CPU 的使用率为 100%,但他的 iowait 为 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 导致的。
那么,到底是哪个进程导致了 CPU 使用率为 100% 呢? 你可以使用 pidstat 来查询:
1 | [root@localhost ~]# pidstat -u 5 1 |
从这里,可以明显看到,stress 进程的 CPU 使用率为 100%。
场景二:I/O 密集型进程
首先还是运行 stress 命令,但这次模拟 I/O 压力,即不停的执行 sync。
打开终端一,执行 stress
1 | [root@localhost ~]# stress -i 1 --timeout 3600 |
打开终端二
1 | [root@localhost ~]# uptime |
打开终端三
1 | [root@localhost ~]# mpstat -P ALL 5 |
从以上操作中,我们看到 1 分钟的平均负载会慢慢的增加,其中一个 CPU 的系统 CPU 使用率提升到了 56 ,同时 iowait 也提升到了 3,这说明平均负载的升高是由于系统资源使用和 iowait 导致。
这里更新 sysstat 包的版本
1 | [root@localhost ~]# wget http://pagesperso-orange.fr/sebastien.godard/sysstat-12.1.1-1.x86_64.rpm |
那么到底是哪个进程,导致系统 CPU 使用率特别高,及 CPU 的等待 wait 情况
1 | [root@localhost ~]# pidstat -u 5 1 |
通过以上的信息,可以很清晰的看到,是由于 stress 进程出现了大量的系统使用。
场景三:大量进程的场景
当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程。
我们打开终端一:使用 stress 模拟 24 个进程
1 | [root@localhost ~]# stress -c 24 --timeout 3600 |
打开终端二:看下当前的负载值
1 | [root@localhost ~]# uptime |
打开终端三:看下进程的资源使用信息
1 | [root@localhost ~]# pidstat -u 5 1 |
我们发现,运行的 24 个 stress 进程,出现了资源争抢的问题,既然出现了资源争抢,就会出现等待时间 wait。
注意事项
1、iowait 不等于 cpu wait。
2、iowait 多少算高。
1 | 一般 iowait 达 30% 就算高了,需要关注。 |