前言
作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。
概念介绍
load average
是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运行队列中的进程数量(正在运行或等待 CPU 的进程数)。它并不是 CPU 使用率,但它与 CPU 的工作压力密切相关。判断负载是否过高需要结合以下几个因素:
一.、核心数对负载的影响
-
一般规则:
如果负载均值接近或超过 CPU 核心数,系统可能会出现性能问题。- 单核 CPU:
load average
接近 1 就是高负载。 - 四核 CPU:
load average
接近 4 才算高负载。 - 八核 CPU:
load average
接近 8 才算高负载。
- 单核 CPU:
-
计算公式:
- 负载比率 > 1:CPU 压力较大,可能会出现进程排队。
- 负载比率 < 1:系统处于健康状态,CPU 有余量。
二、 负载的参考范围
- 低负载:负载比率 < 0.7,系统基本空闲。
- 中负载:负载比率 0.7 ~ 1.0,CPU 处于较忙状态。
- 高负载:负载比率 > 1.0,进程开始排队,系统性能下降。
- 过载:负载比率 > 2.0(或远超核心数),可能会导致应用响应缓慢或卡顿。
三、 综合考量因素
负载不等于高 CPU 使用率,需要结合 I/O 等其他指标分析:
- I/O 瓶颈:如果
load average
高,但 CPU 使用率低,可能是磁盘 I/O 问题(检查%wa
,即 I/O 等待时间)。 - 僵尸进程:如果有多个僵尸进程(
zombie
),需要排查进程管理问题。 - 内存不足:当系统频繁使用 Swap 时,负载也会升高。
实例解读
示例 1:4 核系统,负载为 4.5, 4.0, 3.8
- 分析:负载均值接近 4,略高于 CPU 核心数,表示系统处于高负载状态。
- 可能原因:
- CPU 繁忙,有多个线程争抢 CPU 资源。
- 长时间任务堆积,进程等待时间较长。
示例 2:8 核系统,负载为 10.0, 9.5, 8.8
- 分析:负载均值远超 8(CPU 核心数),说明系统严重过载。
- 可能原因:
- CPU 资源不够用,任务排队过多。
- I/O 或内存问题引发的瓶颈。
示例 3:2 核系统,负载为 0.3, 0.2, 0.4
- 分析:负载均值远低于核心数(2),系统处于低负载状态。
- 结论:性能健康,有资源余量。
如何排查高负载问题
- 使用
top
或htop
:查看高 CPU 使用的进程。 - 检查 I/O 性能:
- 使用
iostat
查看磁盘 I/O。 - 使用
iotop
查找 I/O 密集型进程。
- 使用
- 检查内存和 Swap:
- 使用
free -m
查看可用内存。 - 如果 Swap 使用较多,说明内存不足。
- 使用
- 分析具体任务:
- 使用
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
查看占用资源的进程。 - 确保没有异常任务占用资源(如僵尸进程或死循环程序)。
- 使用
四、关于公式中 核心数的取值
负载比率计算中使用的 CPU 核心数 应该是 逻辑核心数,而不是物理核心数。
为什么用逻辑核心数?
-
逻辑核心(线程)是 CPU 可调度的基本单元:
- 系统调度进程时,会将它们分配到逻辑核心上运行。
- 负载平均值 (
Load Average
) 表示的是系统运行队列中的任务数量,它直接与逻辑核心的工作能力相关。
-
超线程的影响:
- 超线程技术(如 Intel 的 Hyper-Threading)让每个物理核心对应 2 个逻辑核心。
- 如果系统支持超线程,那么 CPU 的并发处理能力会提升,因此需要考虑逻辑核心的总数量。
举例说明
情况 1:单 CPU、4 个物理核心,启用了超线程(共 8 个逻辑核心)
- 逻辑核心数:8
- 假设
Load Average = 4
:
情况 2:单 CPU、4 个物理核心,未启用超线程(共 4 个逻辑核心)
- 逻辑核心数:4
- 假设
Load Average = 4
:
如何确定逻辑核心数
运行以下命令获取逻辑核心数:
nproc
或
lscpu | grep "^CPU(s):"
结论
在计算负载比率时,必须使用逻辑核心数,因为这是系统能够同时处理的最大并发任务数。如果仅使用物理核心数,会低估系统的真实处理能力。