Linux之CPU平均负载

问题:

  1. 什么是 CPU 平均负载?
  2. 哪些因素会对平均负载造成影响?
  3. 用什么工具查看平均负载?

和我一起学 Linux性能优化实战

平均负载

平均负载是对处于运行状态和不可中断状态进程的统计,和CPU使用率没有任何关系,通常使用 uptime 查看:

$ uptime
15:31  up 26 days, 17:46, 2 users, load averages: 1.95 1.80 1.71

上述例子中,1.95,1.80 和 1.71 分别表示过去1分钟,5分钟和15分钟的平均负载情况。
在系统有2个CPU情况下:

  • 平均负载为1时,表示只有一半CPU得到了利用
  • 平均负载为2时,表示所有CPU得到了利用
  • 平均负载为4时,表示有一半的进程在竞争CPU

之所以显示1/5/15分钟的平均负载,是因为通过不同时间间隔的情况才能更全面地反映系统的趋势变化。当平均负载高于CPU数量的 70% 时,需要引起注意,开始排查导致负载升高的原因。

进程

进程的状态有x种:

  • 运行状态:
  • 不可中断状态:

影响平均负载的因素

通过平均负载的含义,可以得知平均负载包括使用CPU的进程和等待使用CPU的进程,因此:

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升;
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高;
  • 大量等待 CPU 的进程调度也会导致平均负载升高;

工具

除了使用 uptime,可以安装 stress 和 sysstat 包来进行分析。stress 是一个 Linux 系统压力测试工具,而 sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。这里主要使用两个命令:

  • mpstat: CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
  • pidstat:进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

stress

stress可以模拟CPU使用率,IO读写等情形:

$ stress --cpu 1 --timeout 600 //模拟一个cpu100%
$ stress -i 1 --timeout 600 //模拟IO压力
$ stress -c 8 --timeout 600 //$ stress -c 8 --timeout 600

sysstat

注意需要使用 root 账号来运行以下命令。

mpstat

该命令可以把整体CPU和每个CPU的情况显示出来,%usr 等列的含义在下篇记录。

# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
$ mpstat -P ALL 5

Linux 5.2.11-1.el7.elrepo.x86_64 (izbp1c8isqly84kayy7xd6z)  06/10/2020  _x86_64_    (2 CPU)

08:53:58 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
08:54:03 PM  all    0.40    0.00    0.40    0.00    0.00    0.00    0.00    0.00    0.00   99.20
08:54:03 PM    0    0.40    0.00    0.60    0.00    0.00    0.00    0.00    0.00    0.00   99.00
08:54:03 PM    1    0.40    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.40

pidstat

# 间隔5秒后输出一组数据$ pidstat -u 5 1
Linux 5.2.11-1.el7.elrepo.x86_64 (izbp1c8isqly84kayy7xd6z)  08/08/2020  _x86_64_    (2 CPU)

08:56:39 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
08:56:44 PM     0       445    0.20    0.00    0.00    0.00    0.20     0  dockerd-current
08:56:44 PM     0       451    0.00    0.20    0.00    0.00    0.20     0  docker-containe
08:56:44 PM     0      1052    0.20    0.00    0.00    0.00    0.20     0  rsyslogd
08:56:44 PM    27      1382    0.00    0.20    0.00    0.00    0.20     1  mysqld
08:56:44 PM     0      5570    0.40    0.80    0.00    0.00    1.20     1  AliYunDun

小结

平均负载高可能是CPU密集型任务或是等待密集IO任务引起的;CPU使用率高未必会导致平均负载高。
附思维导图:

CPU load average 平均负载