我们知道:
- 平均负载是指单位时间内,处在可执行状态和不可中断睡眠状态的进程的平均数。也就是说,它包括了处在执行态,阻塞态和就绪态的进程。
- CPU使用率是指在单位时间内CPU处于非空闲状态的时间比,反映了CPU的繁忙程度。例如:单核CPU单位时间内非空闲态运行时间为0.8s,那么他的CPU使用率为80%;双核CPU单位时间内非空闲态运行时间分别为0.4s和0.6s,那么它的CPU使用率为(0.4+0.6)/2*100%=50%
我们再举个更生动的例子: 有一家银行,他只有一个业务窗口,每次只能接待一个人(单核CPU)。有一天一共有五个人来了,那么就会出现一人在办理手续,其余四人在等待的情况(CPU负载为5) 我们约定在业务窗口的那个人只有真正在办理业务才算是真正使用(CPU使用率)如下图
了解了负载与CPU使用率的关系之后,我们来聊聊什么情况下会导致负载上升以及平均负载和CPU使用率的关系
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
案例
本次案例,我会再现三种让平均负载升高的情况。这次案例运用到的工具有stress工具和sysstat工具,关于这两个工具的一些说明,在我的这篇文章里已经提到过,我就不再赘述了 Linux 系统性能分析命令和工具
本次案例的虚拟机配置
1 | # 下载相关工具包 |
场景1:CPU密集型进程(CPU使用率高)
1 | #模拟cpu使用率为100%,持续时间为600s |
可以看到,在过去1分钟内,CPU的平均负载高达1.11,这说明cpu占有率已经超过100% 使用sysstat工具包中的mpstat查看cpu性能情况
1 | mpstat -P ALL 5 |
可以看到,CPU的使用率已经为100%,而且他的iowait只有0. 这说明:平均负载的升高是由于CPU使用率为100%,也就是说CPU使用率的升高导致了平均负载的升高 我们用pidstat命令查看一下进程的性能情况,看看是哪个进程造成了如此高的CPU使用率
1 | pidstat -u 5 1 |
就是刚开始我们所用的stress命令导致了这么一个情况的发生
场景二:I/O 密集型进程 我们首先使用stress工具来模拟IO压力,有时候大量的等待I/O线程也会导致负载升高,即不停的执行sync
1 | -i: 产生n个进程 每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上 |
可以看到,过去1min之内的平均负载高达1.09 看一下CPU性能情况
1 | mpstat -P ALL 5 |
我们看到,图中的 iowait 为0,并没有出现我们认为的 Iowait 升高情况,但是sys升高了,这是为什么呢? 因为对于部分人(包括我)的虚拟机而言,使用的是 stress 中的sync()系统调用,作用是刷新缓冲区内存到磁盘中。而我们的虚拟机缓冲区可能比较小无法产生大的IO压力。这样大部分就都是系统调用的消耗了。
由此可见,大量的等待IO也会导致平均负载的升高,但是CPU使用率不一定升高
场景三:大量进程的场景 在这个场景中,我们模拟同时有8个进程。但是我们的CPU只有一个,剩下7个进程就会在等待CPU,与此同时我们的CPU处于严重过载的状态
1 | 产生8个进程 每个进程都反复不停的计算随机数的平方根 |
由此可见,大量处在就绪态的进程也会导致平均负载的升高
附录
什么是CPU密集型
CPU密集型是指一类计算任务或应用程序,其执行过程主要依赖于中央处理器(CPU)的处理能力,而不是其他系统组件(如内存、硬盘等)。在这种类型的任务中,CPU的计算能力是整个系统性能的瓶颈。
CPU密集型任务通常涉及大量的数值计算、逻辑运算、数据处理和算法执行。一些典型的CPU密集型应用包括:
- 科学计算:包括数学模型求解、数值模拟、天气预测、物理仿真等。
- 图像和视频处理:如图像编辑、视频渲染、视频编解码等。
- 数据分析:涉及大规模数据的处理、排序、搜索、数据挖掘等。
- 人工智能和机器学习:训练深度神经网络时,涉及大量的矩阵运算和向量计算,因此通常是CPU密集型的。
- 加密和解密:加密和解密算法的执行需要大量的数学运算,因此也是CPU密集型的应用。
在处理CPU密集型任务时,性能取决于CPU的速度、核心数量和架构。有时候,可以通过在多个核心上并行执行任务来提高性能,但并不是所有的任务都能充分利用多核处理器的优势。此外,对于某些特定的CPU密集型任务,使用专门的硬件加速器(如GPU、TPU等)可能会显著提高性能。
什么是IO密集型
IO密集型是另一类计算任务或应用程序,其执行过程主要受限于输入输出(I/O)操作的速度,而不是CPU的处理能力。在这种类型的任务中,CPU通常需要等待来自外部设备(如硬盘、网络等)的数据读取或写入,从而使CPU的计算能力得不到充分利用。
IO密集型任务通常涉及大量的文件读写、网络通信、数据库查询等操作。一些典型的IO密集型应用包括:
- 文件操作:涉及大规模的文件读取和写入,例如文件复制、数据备份等。
- 网络通信:涉及网络数据传输的应用,例如网页服务器、视频流服务等。
- 数据库操作:涉及频繁的数据库查询和写入操作,例如在线交易系统、数据存储服务等。
- 大规模数据处理:需要频繁地读取和写入大量数据,例如日志分析、大数据处理等。
在处理IO密集型任务时,CPU的速度和计算能力通常不是性能的瓶颈,而是IO设备的速度和响应时间决定了整体系统性能。因此,针对IO密集型任务,优化IO操作、使用高速IO设备(如SSD)、采用异步IO等技术可以显著提高系统性能。
值得注意的是,某些应用程序可能同时具有CPU密集型和IO密集型的特点,这时候需要综合考虑CPU和IO设备的性能,进行合理的系统优化。