什么是平均负载,以及影响平均负载的因素
一.平均负载的相关概念
1.1 平均负载:指的是单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是单位时间内活跃的进程数。
1.2 可运行状态进程:指的是正在使用CPU或者正在等待CPU调度的进程,也就是处于Running或Runnable的进程。
1.3 不可中断状态进程:指的是正在处于内核态关键流程中的进程,比如最常见的就是调用磁盘的IO读取,简而言之就是当一个进程向磁盘读写数据的时候,为了保证数据的一致性,在得到磁盘回复前,是不能被其他进程或中断打短的,这个时候进程就处于不可中断的状态,如果此时被其他的进程打断就容易出现进程和磁盘中的数据不一致的情况。
二.如何查看系统平均负载
2.1 uptime 命令的使用
查看系统的平均负载我们可以使用uptime命令,如下:
[root@VM-4-14-centos ~]# uptime
17:37:01 up 7:19, 4 users, load average: 0.00, 0.03, 0.66
17:37:01 代表的是当前时间 up 7:19 代表的是系统运行时间 4 users 代表的是正在登录的用户数
最后三个数字 代表的是过去 1分钟,5分钟,15分钟的平均负载
2.2 系统多少负载合适呢?
从平均负载的概念我们都知道它指的是平均的活跃进程数,那么最完美的就是每一个CPU上刚好运行着一个进程,这样CPU的核数得到了充分的利用。
2.3 当平均负载为4时意味着什么?
以我的云服务器为例,4个核心
在我的系统中当平均负载为4时刚好被占用,如果在8个核心的系统中则意味着有50%的CPU空闲,而在一个只有2个核心的系统中则意味着有一半的进程竞争不到CPU。
2.4 如何查看系统CPU核数
[root@VM-4-14-centos ~]# grep 'model name' /proc/cpuinfo | wc -l
4
2.5 平均负载和CPU使用率
有时候我们很容易把平均负载和CPU使用率搞错,其实是不一样的,平均负载指的是单位时间内处于可运行状态或不可中断的进程数,不仅包含了正在使用CPU的进程,还包含等待CPU和等待I/O的进程。而CPU使用率指的是单位时间内CPU的繁忙情况。其实分三种情况
CPU密集型进程,使用大量的CPU导致平均负载升高的同时也会导致CPU使用率升高,此时两者是一样的
I/O密集型进程,等待I/O会导致平均负载升高,但CPU的使用率不一定升高
大量等待CPU调度的进程也会导致平均负载升高,此时的CPU使用率也会比较高
三. 平均负载案例分析
1.机器配置,以及需要安装的包
机器配置: 4CPU ,16GB内存 , CentOS 7.8
安装 stress和sysstat ,yum install stress,yum install sysstat
stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
而 sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能的两个命令 mpstat 和 pidstat。
mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所
有CPU的平均指标。
pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等
性能指标
2.场景1:CPU密集型进程
使用stress命令模拟 一个CPU使用率100%的场景
[root@VM-4-14-centos ~]# stress --cpu 1 --timeout 600
stress: info: [7345] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
使用uptime命令查看平均负载情况
[root@VM-4-14-centos ~]# uptime
18:12:38 up 7:54, 5 users, load average: 0.63, 0.19, 0.15
可以看到负载有升高但是还在可承受范围内,接着我们使用mpstat查看CPU使用率的情况
[root@VM-4-14-centos ~]# mpstat -P ALL 5
Linux 3.10.0-1160.49.1.el7.x86_64 (VM-4-14-centos) 03/19/2022 _x86_64_ (4 CPU)
06:14:56 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %id le
06:15:01 PM all 25.34 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 74. 36
06:15:01 PM 0 0.20 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 99. 20
06:15:01 PM 1 0.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99. 00
06:15:01 PM 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0. 00
06:15:01 PM 3 0.40 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99. 20
06:15:01 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:15:06 PM all 25.34 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 74.46
06:15:06 PM 0 1.00 0.00 0.20 0.20 0.00 0.00 0.00 0.00 0.00 98.60
06:15:06 PM 1 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.80
06:15:06 PM 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:15:06 PM 3 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
06:15:06 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:15:11 PM all 25.33 0.00 0.35 0.00 0.00 0.00 0.00 0.00 0.00 74.32
06:15:11 PM 0 0.60 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 98.80
06:15:11 PM 1 0.40 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.20
06:15:11 PM 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:15:11 PM 3 0.40 0.00 0.40 0.20 0.00 0.00 0.00 0.00 0.00 99.00
-P ALL 代表的是监控所有CPU,后面数字5代表的是每隔5秒输出一组数据,从结果中可以看到有一个CPU的使用率达到了100%
查看哪个进程导致了CPU使用率为100%,我们可以使用pidstat查询
[root@VM-4-14-centos ~]# pidstat -u 5 1
Linux 3.10.0-1160.49.1.el7.x86_64 (VM-4-14-centos) 03/19/2022 _x86_64_ (4 CPU)
06:17:53 PM UID PID %usr %system %guest %CPU CPU Command
06:17:58 PM 0 1810 0.00 0.20 0.00 0.20 3 sgagent
06:17:58 PM 0 1867 0.20 0.20 0.00 0.40 3 barad_agent
06:17:58 PM 0 1969 0.40 0.60 0.00 1.00 0 YDService
06:17:58 PM 0 7346 99.80 0.00 0.00 99.80 2 stress
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1810 0.00 0.20 0.00 0.20 - sgagent
Average: 0 1867 0.20 0.20 0.00 0.40 - barad_agent
Average: 0 1969 0.40 0.60 0.00 1.00 - YDService
Average: 0 7346 99.80 0.00 0.00 99.80 - stress
从结果中可以看到是stress这个进程
场景2:I/O密集型进程
使用stress命令模拟I/O压力
[root@VM-4-14-centos ~]# stress -i 1 --timeout 600
stress: info: [12222] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd
查看负载情况
[root@VM-4-14-centos ~]# uptime
18:47:23 up 8:29, 6 users, load average: 0.69, 0.22, 0.18
查看CPU使用率情况
[root@VM-4-14-centos ~]# mpstat -P ALL 5 1
Linux 3.10.0-1160.49.1.el7.x86_64 (VM-4-14-centos) 03/19/2022 _x86_64_ (4 CPU)
07:05:35 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:05:40 PM all 0.10 0.00 24.70 0.40 0.00 0.00 0.00 0.00 0.00 74.80
07:05:40 PM 0 0.00 0.00 96.80 1.60 0.00 0.00 0.00 0.00 0.00 1.60
07:05:40 PM 1 0.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 99.00
07:05:40 PM 2 0.20 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 99.20
07:05:40 PM 3 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 0.10 0.00 24.70 0.40 0.00 0.00 0.00 0.00 0.00 74.80
Average: 0 0.00 0.00 96.80 1.60 0.00 0.00 0.00 0.00 0.00 1.60
Average: 1 0.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 99.00
Average: 2 0.20 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 99.20
Average: 3 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40
查看是哪个进程,导致iowait高,可以看到是stress进程导致的
pidstat -u 5 1
Linux 3.10.0-1160.49.1.el7.x86_64 (VM-4-14-centos) 03/19/2022 _x86_64_ (4 CPU)
07:07:39 PM UID PID %usr %system %guest %CPU CPU Command
07:07:44 PM 0 1326 0.00 0.20 0.00 0.20 2 tat_agent
07:07:44 PM 0 1866 0.20 0.00 0.00 0.20 2 barad_agent
07:07:44 PM 0 1867 0.20 0.20 0.00 0.40 3 barad_agent
07:07:44 PM 0 1969 0.40 0.60 0.00 1.00 2 YDService
07:07:44 PM 0 14986 0.00 97.41 0.00 97.41 0 stress
07:07:44 PM 0 15292 0.00 0.40 0.00 0.40 1 kworker/u8:2
07:07:44 PM 0 15450 0.00 0.20 0.00 0.20 3 pidstat
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1326 0.00 0.20 0.00 0.20 - tat_agent
Average: 0 1866 0.20 0.00 0.00 0.20 - barad_agent
Average: 0 1867 0.20 0.20 0.00 0.40 - barad_agent
Average: 0 1969 0.40 0.60 0.00 1.00 - YDService
Average: 0 14986 0.00 97.41 0.00 97.41 - stress
Average: 0 15292 0.00 0.40 0.00 0.40 - kworker/u8:2
Average: 0 15450 0.00 0.20 0.00 0.20 - pidstat
场景三: 大量进程的场景
当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程
使用stress模拟八个进程
stress -c 8 --timeout 600
使用pidstat看下进程的情况
[root@VM-4-14-centos ~]# pidstat -u 5 1
Linux 3.10.0-1160.49.1.el7.x86_64 (VM-4-14-centos) 03/19/2022 _x86_64_ (4 CPU)
07:17:26 PM UID PID %usr %system %guest %CPU CPU Command
07:17:31 PM 0 1326 0.00 0.20 0.00 0.20 2 tat_agent
07:17:31 PM 0 1867 0.20 0.00 0.00 0.20 3 barad_agent
07:17:31 PM 0 1939 0.20 0.00 0.00 0.20 1 YDLive
07:17:31 PM 0 1969 0.00 0.20 0.00 0.20 2 YDService
07:17:31 PM 0 16059 24.15 0.00 0.00 24.15 3 stress
07:17:31 PM 0 16060 24.35 0.00 0.00 24.35 1 stress
07:17:31 PM 0 16061 20.76 0.00 0.00 20.76 0 stress
07:17:31 PM 0 16062 22.55 0.00 0.00 22.55 2 stress
07:17:31 PM 0 16063 23.55 0.00 0.00 23.55 0 stress
07:17:31 PM 0 16064 23.35 0.00 0.00 23.35 0 stress
07:17:31 PM 0 16065 19.56 0.00 0.00 19.56 1 stress
07:17:31 PM 0 16066 23.55 0.00 0.00 23.55 0 stress
07:17:31 PM 0 16067 26.75 0.00 0.00 26.75 3 stress
07:17:31 PM 0 16068 23.95 0.00 0.00 23.95 1 stress
07:17:31 PM 0 16069 27.35 0.00 0.00 27.35 3 stress
07:17:31 PM 0 16070 23.55 0.00 0.00 23.55 1 stress
07:17:31 PM 0 16071 21.76 0.00 0.00 21.76 1 stress
07:17:31 PM 0 16072 43.31 0.00 0.00 43.31 1 stress
07:17:31 PM 0 16073 25.95 0.00 0.00 25.95 2 stress
07:17:31 PM 0 16074 24.55 0.00 0.00 24.55 1 stress
07:17:31 PM 0 16844 0.00 0.20 0.00 0.20 1 pidstat
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1326 0.00 0.20 0.00 0.20 - tat_agent
Average: 0 1867 0.20 0.00 0.00 0.20 - barad_agent
Average: 0 1939 0.20 0.00 0.00 0.20 - YDLive
Average: 0 1969 0.00 0.20 0.00 0.20 - YDService
Average: 0 16059 24.15 0.00 0.00 24.15 - stress
Average: 0 16060 24.35 0.00 0.00 24.35 - stress
Average: 0 16061 20.76 0.00 0.00 20.76 - stress
Average: 0 16062 22.55 0.00 0.00 22.55 - stress
Average: 0 16063 23.55 0.00 0.00 23.55 - stress
Average: 0 16064 23.35 0.00 0.00 23.35 - stress
Average: 0 16065 19.56 0.00 0.00 19.56 - stress
Average: 0 16066 23.55 0.00 0.00 23.55 - stress
Average: 0 16067 26.75 0.00 0.00 26.75 - stress
Average: 0 16068 23.95 0.00 0.00 23.95 - stress
Average: 0 16069 27.35 0.00 0.00 27.35 - stress
Average: 0 16070 23.55 0.00 0.00 23.55 - stress
Average: 0 16071 21.76 0.00 0.00 21.76 - stress
Average: 0 16072 43.31 0.00 0.00 43.31 - stress
Average: 0 16073 25.95 0.00 0.00 25.95 - stress
Average: 0 16074 24.55 0.00 0.00 24.55 - stress
Average: 0 16844 0.00 0.20 0.00 0.20 - pidstat
四.总结
其实正常分析直接可以使用top命令分析CPU使用率,分析IO的话使用iostat,iotop分析I/O读取异常,本文仅作学习记录,部分知识来源于,极客时间《Linux性能优化实战》