什么是平均负载

平均负载可以对于我们来说及熟悉又陌生,但我们问平均负载是什么,但大部分人都回答说平均负载不就是单位时间内CPU使用率吗?其实并不是这样的,如果可以的话,可以 man uptime 来了解一下平均负载的详细信息。

简单的说平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是说平均活跃进程数,它和CPU使用率并没有直接关系。这里解释一下可运行状态和不可中断这两个词。

可运行状态:

  • 指正在使用CPU或者正在等待CPU的进程,我们使用ps命令查看处于R状态的进程

不可中断状态:

  • 进程则是正处于内核态关键流程中的进程,并且这些流程是不可中断的。例如:常见的等待硬件设备I/O的响应,也就是我们在ps命令查看处于D状态的进程

比如,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程中断或者打断的,这个时候的进程处于不可中断状态,如果此时的进程被打断了,就容易出现磁盘数据和进程数据不一致的问题。

所以,不可中断状态实际上是系统进程和硬件设备的一种保护机制。

因此,你可以简单理解为,平均负载就是平均活跃进程数。平均活跃进程数,直观上的理解就是单位时间内的活跃进程数,但它实际上是活跃进程数的指数衰减平均值。既然是平均活跃进程数,那么理想状态,就是每个CPU上都刚好运行着一个进程,这样每个CPU都会得到充分的利用。例如平均负载为2时,意味着什么呢?

  • 在只有2个CPU的系统上,意味着所有的CPU刚好被完全占用
  • 在4个CPU的系统上,意味着CPU有50%的空闲
  • 而在只有1个CPU的系统上,则意味着有一半的进程竞争不到CPU

平均负载和CPU使用率

现实工作中,我们经常容易把平均负载和CPU使用率混淆,所以在这里,我也做一个分区。

可能你会疑惑,既然平均负载代表的是活跃进程数,那平均负载高了,不就意味着CPU使用率高吗?

我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数,所以,它不仅包括了正常使用CPU的进程,还包括了等待CPU和等待I/O的进程。

而CPU使用率,是单位时间内CPU的繁忙情况的统计,跟平均负载并不一定完全对应,例如:

  • CPU密集型进程,使用大量CPU会导致平均负载升高,此时这两者是一致的
  • I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高
  • 大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率会很高

平均负载案例

这里我们需要安装几个工具sysstat、stress、stress-ng

这里Centos的sysstat版本会老一点,最好升级到最新版本。手动rpm安装或者源码安装

场景一、CPU密集型

1、运行一个stress命令,模拟一个CPU使用率100%场景

$ stress --cpu  --timeout 

2、开启第二个终端,uptime查看平均负载的变化情况

$ watch -d uptime
:: up days, :, users, load average: 1.62, 1.10, 0.87

3、开启第三个终端,mpstat 查看CPU使用率的变化情况

$ mpstat -P ALL  20
10:06:37 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:06:42 AM  all   31.50    0.00    0.35    0.00    0.00    0.00    0.00    0.00    0.00   68.15
10:06:42 AM    0    1.20    0.00    0.80    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:06:42 AM    1    7.21    0.00    0.40    0.00    0.00    0.00    0.00    0.00    0.00   92.38
10:06:42 AM    2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
10:06:42 AM    3   17.43    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   82.36
# -P ALL 表示监控所有CPU,后面数字5 表示间隔5秒输出一次数据

从第二个终端可以看到,1分钟平均负载增加到1.62,从第三个终端我们可以看到有一个CPU使用率100%,但iowait为0,这说明平均负载的升高正式由CPU使用率为100%

那我们查看是那个进程导致了CPU使用率为100%呢?我们可以使用pidstat来查看:

#每5秒输出一次数据
$ pidstat -u
:: AM UID PID %usr %system %guest %wait %CPU CPU Command
:: AM 0.20 0.00 0.00 0.00 0.20 systemd
:: AM 0.00 1.00 0.00 0.20 1.00 systemd-journal
:: AM 0.60 0.00 0.00 0.00 0.60 rsyslogd
:: AM 100.00 0.00 0.00 0.00 100.00 stress
:: AM 0.20 0.20 0.00 0.00 0.40 pidstat

从这里我们可以看到是stress这个进程导致的。

场景二、I/O密集型进程

1、我们使用stress-ng命令,但这次模拟I/O压力,既不停执行sync:

#--hdd表示读写临时文件
#-i 生成几个worker循环调用sync()产生io压力
$ stress-ng -i --hdd --timeout

2、开启第二个终端运行uptime查看平均负载情况

$ watch -d uptime
:: up days, :, users, load average: 1.71, 0.75, 0.69

3、开启第三个终端运行mpstat查看CPU使用率

$ mpstat -P ALL
:: AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
:: AM all 6.80 0.00 33.75 26.16 0.00 0.39 0.00 0.00 0.00 32.90
:: AM 4.03 0.00 69.57 19.91 0.00 0.00 0.00 0.00 0.00 6.49
:: AM 25.32 0.00 9.49 0.00 0.00 0.95 0.00 0.00 0.00 64.24
:: AM 0.24 0.00 10.87 63.04 0.00 0.48 0.00 0.00 0.00 25.36
:: AM 1.42 0.00 36.93 14.20 0.00 0.28 0.00 0.00 0.00 47.16

从这里可以看到,1分钟平均负载会慢慢增加到1.71,其中一个CPU的系统CPU使用率升到63.04。这说明,平均负载的升高是由于iowait升高。

那么我们到底是哪个进程导致的呢?我们使用pidstat来查看:

$ pidstat -u
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0.00 0.19 0.00 0.00 0.19 - systemd
Average: 0.00 0.19 0.00 1.56 0.19 - rcu_sched
Average: 0.58 1.75 0.00 0.39 2.33 - systemd-journal
Average: 0.19 0.19 0.00 0.00 0.39 - rsyslogd
Average: 0.00 1.56 0.00 1.17 1.56 - kworker/:-events_power_efficient
Average: 0.00 0.39 0.00 0.78 0.39 - kworker/:-events_power_efficient
Average: 0.00 0.19 0.00 0.58 0.19 - kworker/:-events
Average: 0.00 97.67 0.00 0.19 97.67 - kworker/u8:+flush-:
Average: 0.00 0.97 0.00 1.56 0.97 - kworker/:-mm_percpu_wq
Average: 0.00 21.79 0.00 0.19 21.79 - stress-ng-hdd
Average: 0.00 1.95 0.00 1.36 1.95 - stress-ng-io
Average: 0.00 2.72 0.00 0.39 2.72 - stress-ng-io
Average: 0.00 1.36 0.00 1.75 1.36 - stress-ng-io
Average: 0.00 2.72 0.00 0.58 2.72 - stress-ng-io

可以发现是stress-ng导致的

场景三、大量进程的场景

当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程。

比如:我们使用stress,但这次模拟8个进程:

$ stress -c  --timeout 

我们的系统只有4颗CPU,这时候要运行8个进程,是明显不够的,系统的CPU后严重过载,这时候负载值达到了4点多:

$  uptime
:: up days, :, users, load average: 4.52, 2.82, 2.67

接着我们运行pidstat来查看一下进程的情况:

$ pidstat -u
Linux 5.0.-.el7.elrepo.x86_64 (k8s-m1) // _x86_64_ ( CPU) :: AM UID PID %usr %system %guest %wait %CPU CPU Command
:: AM 0.20 0.00 0.00 0.00 0.20 systemd
:: AM 0.00 0.99 0.00 0.20 0.99 systemd-journal
:: AM 0.60 0.20 0.00 0.00 0.79 rsyslogd
:: AM 51.59 0.00 0.00 48.21 51.59 stress
:: AM 44.64 0.00 0.00 54.96 44.64 stress
:: AM 45.44 0.00 0.00 54.56 45.44 stress
:: AM 45.44 0.00 0.00 54.37 45.44 stress
:: AM 51.59 0.00 0.00 48.21 51.59 stress
:: AM 48.41 0.00 0.00 51.19 48.41 stress
:: AM 45.24 0.00 0.00 54.37 45.24 stress
:: AM 48.81 0.00 0.00 50.99 48.81 stress
:: AM 0.00 0.40 0.00 0.20 0.40 pidstat

可以看出,8个进程抢占4颗CPU,每个进程等到CPU时间(%wait)高达50%,这些都超出CPU计算能力的进程,最终导致CPU过载。

最新文章

  1. 我收录整理的优秀OC技术类文章
  2. 蛙蛙推荐:WEB安全入门
  3. Bash中的任务(job)管理
  4. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
  5. bootstrap日期选择器-datetimepicker
  6. 【Log4j】 log4j.properties 使用
  7. Delphi实现文件关联
  8. progressbar使用方法:进度画面大小,进度画面背景,进度百分比
  9. H5实现图片优化上传
  10. eclipse svn2.0.0插件 手动安装方法
  11. Angular路由(三)
  12. JDK8中JVM对类的初始化探讨
  13. Centos7 通配符HTTPS证书申请 实测 笔记
  14. 根据元素类型获取tuple中的元素
  15. Python Socket通信例子
  16. List与Array之间互换
  17. mongodb的安装与启动(centos7)
  18. Spring注解大全,汇总版
  19. Process Explorer常用操作介绍
  20. Python Seaborn 笔记

热门文章

  1. Linux终端彩色显示输出结果
  2. Ubuntu系统---C++之VScode IDE 编译器安装
  3. Netty搭建服务端的简单应用
  4. java8之Metaspace
  5. 一致性Hash算法(转载)
  6. #2002 Cannot log in to the MySQL server, PHPMyAdmin/MySQL
  7. 四、vue基础--自定义组件
  8. python基础认识
  9. 表单文本字段预期描述(placeholder="请输入产品名称"以及prompt:'输入价格')
  10. kindeditor实现ctrl+v粘贴word图片并上传