Linux 的一分钟负载
什么是 Linux 负载
Linux 负载(Load Average)是衡量系统资源使用情况的重要指标,它反映了系统在特定时间段内的平均活跃进程数。当我们执行 uptime 或 top 命令时,会看到三个数字,分别代表 1分钟、5分钟和15分 钟的平均负载。
负载的核心含义:负载值表示有多少个进程正在竞争系统资源,包括:
- 正在 CPU 上运行的进程
- 等待 CPU 调度的进程
- 等待 I/O 操作完成的进程
- 处于不可中断睡眠状态的进程
一分钟负载的计算原理
一分钟负载并不是简单的算术平均值,而是使用指数移动平均(Exponential Moving Average)算法计算得出的。
指数衰减算法
// 负载计算的核心算法
type LoadCalculator struct {
load1 float64 // 1分钟负载
load5 float64 // 5分钟负载
load15 float64 // 15分钟负载
}
// 指数衰减系数
const (
EXP_1 = 1.0 / math.Exp(5.0/60.0) // 1分钟: 0.9200
EXP_5 = 1.0 / math.Exp(5.0/300.0) // 5分钟: 0.9835
EXP_15 = 1.0 / math.Exp(5.0/900.0) // 15分钟: 0.9945
)
// 每5秒更新一次负载
func (lc *LoadCalculator) updateLoad(activeProcesses int) {
active := float64(activeProcesses)
// 指数衰减计算
lc.load1 = lc.load1*EXP_1 + active*(1-EXP_1)
lc.load5 = lc.load5*EXP_5 + active*(1-EXP_5)
lc.load15 = lc.load15*EXP_15 + active*(1-EXP_15)
}
这种算法的特点是近期的样本权重更大,远期的样本权重逐渐衰减,能够快速响应系统负载的变化,同时保持一定的稳定性。