Linux 系统中的 CPU。文章 2:平均负载

大家好!我是大聪明-PLUS

在之前的文章中,我们讨论了 CPU 整体利用率**。** 然而,在 Linux 世界中,还有另一种常用的系统负载监控方法,它也与 CPU 消耗相关。不过,它的工作方式不同,它不仅显示 CPU 利用率,还显示整体负载,使我们能够评估系统的当前状态以及其随时间变化的动态变化。这种方法称为负载平均值。

第二条 平均负载

负载平均值是 Linux 中用于评估系统整体负载的关键指标。它表示在指定时间间隔(1 分钟、5 分钟和 15 分钟)内,CPU 上运行或等待运行的进程的平均数量。与简单的 CPU 使用率百分比相比,该指标能为系统管理员提供更全面、更详细的当前负载情况。

这个指标并非一直如此强大和通用------直到 1993 年左右,它与其他 Unix 系统中的同类指标一样,仅显示平均 CPU 负载,而忽略其他资源需求。1993 年 10 月 29 日(星期五)发布的一个补丁改变了一切,其中作者写道:

内核在计算平均负载时只统计"可运行"进程。我不喜欢这样;问题在于,那些正在进行数据交换或等待"快速"(即不可中断的)I/O 操作的进程也会消耗资源。

用慢速交换磁盘替换快速交换磁盘后,负载平均值反而下降,这似乎有点违反直觉......

总之,以下补丁似乎使系统负载平均值与系统主观运行速度更加一致。而且,最重要的是,当系统处于空闲状态时,负载仍然为零。

我没有费心去研究代码后来的发展,但重点是,从那时起,人们开始将这个指标视为系统负载,而不是 CPU 负载。

如何计算平均负载?

从上面的表述或一些网络文章来看,你可能会觉得 Linux 系统中的"平均值"是指一段时间内各点的算术平均值。然而,与简单的算术平均值不同,Linux 中的负载平均值是使用指数移动平均法计算的。

这种方法考虑了系统负载的近期变化,并赋予其比旧数据更高的权重。这提供了更直接、更稳定的数值,对于监控系统性能尤为有用。

平均负载计算公式:

这里

**LA(t)**是负载平均值的新值。

LAprev --- 负载平均值的前一个值。

n是执行队列中当前进程的数量(正在运行的进程 + 等待的进程)。

t --- 自上次更新以来的时间。

𝛕 为时间常数(1 分钟、5 分钟和 15 分钟时的值不同):

  • 1 分钟:𝛕 = 60 秒。

  • 5 分钟:𝛕 = 300 秒。

  • 15 分钟:𝛕 = 900 秒。

Linux 内核每秒都会使用平滑公式更新负载平均值。对于三个指标(1 分钟、5 分钟和 15 分钟),分别使用不同的阻尼因子:

该公式可以平滑系统中的突变。例如,如果您发起一项大负载任务,负载平均值不会立即达到最大值,而是会逐渐增加。

计算示例

假设当前LA(1 分钟) = 0.5,并且在时间 t 时队列中有 4 个进程。

新的平均负载计算方法如下:

LA(1)=0.5×0.983+4×(1−0.983) =0.5×0.983+4×0.017 = 0.4915+0.068=0.5595

LA(1)=0.5595×0.983+4×(1−0.983)=0.6179

LA(1)=0.6179×0.983+4×(1−0.983)=0.6755

... 等等 ...

因此,新的平均负载值不会立即变为 4,而是逐渐增加。

这种方法有助于更准确地反映系统的当前状态。

**从数学角度来说,这三个值始终代表系统启动以来整个系统负载的平均值。**它们都呈指数衰减,但衰减速率不同:分别在 1 分钟、5 分钟和 15 分钟后相对于 e 呈指数衰减。因此,1 分钟的平均负载由过去 1 分钟负载的 63%(更准确地说:1 - 1/e)和自启动以来(不包括过去 1 分钟)平均负载的 37%(1/e)组成。对于 5 分钟和 15 分钟的平均负载,分别计算出相同的 63% / 37% 比例。

因此,说平均 1 分钟负荷只包括最后 60 秒的活动是不准确的,因为它包含了过去 37% 的活动,但说它主要包括最后一分钟是正确的。

实际应用

  1. 如果平均负载小于核心数,则系统运行正常。

  2. 如果平均负载 ≈ 核心数 → CPU 负载为 100%。

  3. 如果平均负载 > 核心数 → 有进程等待运行,则可能存在问题。

例如,在一台 8 核服务器上:

  • LA(5) = 4 → CPU 负载为 50%

  • LA(5) = 12 → CPU 过载,出现延迟

为什么平均负载比 CPU 负载百分比更可取?

  1. 考虑排队进程。平均负载不仅考虑 CPU 上运行的活动进程,还考虑等待轮到自己的进程。这能更全面地反映系统负载。而 CPU 负载百分比仅显示当前处理器活动,并未考虑排队进程,这可能导致对实际负载的低估。

  2. 集成负载指标。平均负载涵盖所有处理器核心。在多处理器或超线程系统中,它比 CPU 百分比更能反映实际系统负载,因为 CPU 百分比可能无法反映执行队列中进程的累积情况。

  3. I/O 统计。平均负载会将处于"不可中断睡眠"状态、等待 I/O 操作完成的进程考虑在内。即使这些进程不直接占用 CPU,它们也会对系统性能产生显著影响,而这一点仅使用 CPU 负载百分比是无法体现的。

  4. 趋势分析。"平均负载"提供三个时间间隔(1分钟、5分钟和15分钟)的数据,方便您监控系统负载变化并预测潜在问题。"CPU负载百分比"仅提供快照,不支持动态分析。

所以,刚才那里提到了超线程技术吗?

在超线程系统中,每个物理处理器处理两条指令流,从而形成逻辑核心。Linux 将这些指令流视为独立的核心。因此,一个拥有 4 个物理核心并启用超线程的系统将拥有 8 个逻辑核心。在这种系统中,负载平均值为 8.0 表示所有逻辑核心均已充分利用,但这并不一定意味着计算能力翻倍。与未启用超线程的系统相比,启用超线程的系统在高负载平均值下可能会出现更快的性能下降。我们将在后续文章中更详细地讨论超线程,包括其优缺点以及具体影响。

总而言之

**负载平均值是比简单的 CPU 负载百分比更复杂、信息更丰富的系统负载评估指标。**它不仅考虑当前的 CPU 活动,还考虑待处理的进程和其他重要因素,例如 I/O 操作。这使其成为监控和管理 Linux 系统性能的必备工具,尤其是在高负载或具有多核和超线程技术的服务器上。

相关推荐
listhi5202 小时前
使用SCP命令在CentOS 7上向目标服务器传输文件
linux·服务器·centos
天一生水water3 小时前
什么是调压器的P2s
linux·服务器·网络
风中凌乱3 小时前
ftp服务的安装与部署
linux·服务器
赖small强3 小时前
【Linux驱动开发】Linux Input子系统架构深度解析
linux·驱动开发·input·按键驱动·libinput
hero_heart3 小时前
ubuntu 密码重置(不用系统盘)
linux·运维·ubuntu
2301_816073834 小时前
SELinux 学习笔记
linux·运维·前端
Ronin3054 小时前
【Linux网络】传输层协议UDP
linux·网络·udp·传输层
ycydynq5 小时前
python html 解析的一些写法
linux·python·html
知识分享小能手5 小时前
openEuler入门学习教程,从入门到精通,openEuler 24.03 中的 Vim 编辑器 —— 全面知识点详解(7)
linux·vim·openeuler