在聊平均负载之前,可以看看cpu硬件资源信息。lscpu 也作为经常使用的指标工具。

   系统性能之cpu 篇(一)_cpu

1.平均负载是什么

概念: 平均负载指单位时间内,系统处于可运行状态和不可中断的平均进程数,和cpu使用率没有直接关系。

所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps -aux 命令看到的STAT处于 R 状态(Running 或 Runnable)的进程。

不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。

2.平均负载为多少是合理的

系统uptime 看到的结果里,三个时间段的平均负载,多大的时候说明系统负载高,什么时候说明系统负载低。最理性的情况是等于cpu 逻辑个数。判断系统有几个cpu,通过top命令或者文件/proc/cpuinfo获取。

# grep 'model name' /proc/cpuinfo | wc -l

4
#uptime

load average: 0.00, 0.01, 0.05

系统负载3个值该参考哪一个呢?

如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。

如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载。

反过来,如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了。

假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那么说明在过去 1 分钟内,系统有 73% 的超载,而在 15 分钟内,有 698% 的超载,从整体趋势来看,系统的负载在降低。

合理的平均负载高于cpu数量70% 就得注意。

3.平均负载案例分析

从上文对平均负载均衡定义内容,这里进程不仅包括正在使用的cpu进程,等待cpu和等待I/0 的进程。

以下会列举3个场景造成cpu负载高的示例分析,包括 cpu密集型进程;I/O等待型进程;大量等待cpu进程调度。

先介绍下分析工具:

stress 是linux 系统压力测试工具

sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。我们的案例会用到这个包的两个命令 mpstat 和 pidstat。mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

3.1 cpu密集型进程

终端一执行stress命令

$ stress --cpu 1 --timeout 600

终端二运行uptime 查看平均负载情况

# -d 参数表示高亮显示变化的区域

$ watch -d uptime
..., load average: 1.00, 0.75, 0.39

终端三查看cpu使用率变化情况,发现两cpu中的一cpu使用率达到了100%,说明平均负载升高由于cpu使用率为100%。

# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
$ mpstat -P ALL 5
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:30:06 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:30:11 all 50.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 49.95
13:30:11 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
13:30:11 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

使用pidstat 查询是哪个进程造成cpu 使用率为100%? 可以查看到是stress 进程造成的,继而做后续处理。

间隔5秒后输出一组数据
$ pidstat -u 5 1
13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command
13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress

3.2 I/O等待型进程

终端一执行stress命令

$ stress -i 1 --timeout 600

终端二运行uptime 查看平均负载情况

# -d 参数表示高亮显示变化的区域

$ watch -d uptime
..., load average: 1.00, 0.75, 0.39

终端三查看cpu使用率变化情况,可以看到一cpu%iowait 达到67.53.说明平均负载的升高跟iowait升高有关。

# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:41:28 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:33 all 0.21 0.00 12.07 32.67 0.00 0.21 0.00 0.00 0.00 54.84
13:41:33 0 0.43 0.00 23.87 67.53 0.00 0.43 0.00 0.00 0.00 7.74
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99

使用pidstat 查询是哪个进程造成iowait高? 可以查看到%wait 为3.99,stress 进程造成的,继而做后续处理。

# 间隔5秒后输出一组数据,-u表示CPU指标
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command
13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H
13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H
13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress
13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat

3.3 大量等待cpu进程

终端一执行stress命令

$ stress -c 8 --timeout 600

系统只有2c,模拟8个进程,因此cpu会出现严重的过载情况,平均负载达到7.9 

$ uptime
..., load average: 7.97, 5.93, 3.02

使用pidstat 查询进程情况 ,可以看到8个stress在争抢2cpu,没给进程等待cpu时间高代75%,超出cpu计算能力。分析是stress 进程导致的,继而做后续处理。

间隔5秒后输出一组数据
$ pidstat -u 5 1
14:23:25 UID PID %usr %system %guest %wait %CPU CPU Command
14:23:30 0 3190 25.00 0.00 0.00 74.80 25.00 0 stress
14:23:30 0 3191 25.00 0.00 0.00 75.20 25.00 0 stress
14:23:30 0 3192 25.00 0.00 0.00 74.80 25.00 1 stress
14:23:30 0 3193 25.00 0.00 0.00 75.00 25.00 1 stress
14:23:30 0 3194 24.80 0.00 0.00 74.60 24.80 0 stress
14:23:30 0 3195 24.80 0.00 0.00 75.00 24.80 0 stress
14:23:30 0 3196 24.80 0.00 0.00 74.60 24.80 1 stress
14:23:30 0 3197 24.80 0.00 0.00 74.80 24.80 1 stress
14:23:30 0 3200 0.00 0.20 0.00 0.20 0.20 0 pidstat