试着推导一下Linux中计算Load Average的算式
参考:www.fortra.com/resources/g…

对于这个RC电路,根据串联电路的电压关系,
(1)
Vb=VC+VR
又因为
(2)
VC=C1q
(3)
将(2)、(3)代入(1),并整理,得到
(4)
RI=−C1q+Vb
两边同时乘以C
(5)
RIC=−q+CVb
考虑t时刻的瞬时电流
(6),
I(t)=dtdq(t)
将(6)代入(5),并整理
(7)
RC(dtdq(t))=−q(t)+CVb(t)
解微分方程(7),得到
(8)
q(t)=e−RCt+c+CVb(t)
忽略常数项c
(9)
q(t)=e−RCt+CVb(t)
考虑(t−Δt)时刻的状态
(10)
q(t−Δt)=e−RCt−Δt+CVb(t−Δt)
(10)两端同时乘以下面这个因数
(11)
e−RCΔt
(12)
e−RCΔtq(t−Δt)=e−RCΔte−RCt−Δt+e−RCΔtCVb(t−Δt)
化简(12)
(13)
e−RCΔtq(t−Δt)=e−RCΔt−RCt−Δt+e−RCΔtCVb(t−Δt)
(14)
e−RCΔtq(t−Δt)=e−RCt+e−RCΔtCVb(t−Δt)
带入(9),并整理
(14)
e−RCΔtq(t−Δt)=q(t)−CVb(t)+e−RCΔtCVb(t−Δt)
(15)
q(t)=e−RCΔtq(t−Δt)+CVb(t)−e−RCΔtCVb(t−Δt)
假设在很短的Δt时间内,Vb(t)=Vb(t−Δt)=Vb,则
(17)
q(t)=e−RCΔtq(t−Δt)+(1−e−RCΔt)CVb
而Linux的Load Average为
avenrun[t] = avenrun[t-Δt] * exp + nr_active * (1 - exp)
其中,
q(t) = avenrun[t] -> run queue length
exp = e^(-Δt/RC) -> weight
nr_active = CV_b -> current active processes
The sampled value of the electric charge (q(t)) at time step (t) corresponds to the sampled run-queue length, q(t-Δt) is the previous sample of the run-queue, and the amount of charge remaining in the capacitor represents the number of active processes (CV_b).