系统优化-CPU-理解CPU的平均负载

本章主要讲解如何理解CPU的平均负载、以及常见的引起CPU平均负载升高的几种场景。

什么是CPU的平均负载

指单位时间内系统可运行(Runnable)以及不可中断(Uninterruptible Sleep)的平均进程数。其中不可中断是指系统对进程和设备的一种保护,比如读磁盘的文件为了保证系统的一致性这个进程不可中断 ps命令中是D

如何查看平均负载呢:

常用命令有:uptime|top|w,我们1以uptime为例,如:

1
2
$ uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88

其中:load average: 0.63, 0.83, 0.88 分别代表了最近1分钟、5分钟、15分钟的cpu平均负载,什么是laod avarage呢

平均负载反映了这段时间操作系统的CPU负载的趋势,一般来讲,一个健康的系统的平均负载不应该超过0.7

引起平均负载升高的常见的三种场景

和平均负载相关的另一项数据是CPU的使用率,他们俩的关系根据场景有如下的联系

  1. 计算密集型:cpu使用率和cpu负载会同时升高
  2. I/O密集型:大量的线程处于i/o-wait,这时候cpu负载高但是cpu使用率并不高
  3. 当需要调度的进程数量大于cpu的时候,cpu负载和使用率会同时升高。

    我们怎么确定上述的3中场景呢?这时候我们可以用到如下的工具:

  • stress 压测工具
  • sysstat linux性能分析工具,常用mpstat和pidstat

模拟计算密集型

见下图:

mpstat的结果显示这时候看%iowait不高,但是%user已经100%了
pidstat的结果显示是stress引起的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
stress --cpu 1 --timeout 600 #一个核打满

#查看系统性能
# -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

#分析由于iowait为0,user很高说明是CPU计算导致的,于是我们
# 间隔 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

模拟IO密集型

见下图:

mpstat的结果显示这时候看%iowait很高67.53,但是%user才0.43
pidstat的结果显示是stress引起的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#发送sync
$ stress -i 1 --timeout 600

#查看系统性能
# 显示所有 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

#分析使用率不高但是iowait很高
# 间隔 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

#发现stress导致的

大量CPU调度

pidstat的结果显示%wait的结果很高,%iowait和cpu都不高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#发送sync
$ stress -c 8 --timeout 600

#查看系统性能
# 间隔 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

#发现stress导致的

总结

  1. 计算密集型:mpstat如果%user很高,但是%iowait不高,再用pidstat查看进程的%wait如果也不高。
  2. I/O密集型:mpstat如果%user不高,但是%iowait很高,再用pidstat查看进程的%wait如果也不高。
  3. 大量的进程需要调度:mpstat如果%user不高,但是%iowait不高,再用pidstat查看进程的%wait如果很高。