![FreeBSD 上的平均负载是如何计算的?](https://linux22.com/image/104516/FreeBSD%20%E4%B8%8A%E7%9A%84%E5%B9%B3%E5%9D%87%E8%B4%9F%E8%BD%BD%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E7%9A%84%EF%BC%9F.png)
在 Linux 上,平均负载是过去 1 分钟、5 分钟和 15 分钟内可运行或等待的平均进程数。
在 OpenBSD 上(和可能其他 BSD,但引用和上下文都没有真正说明),平均负载是“在最近 5 秒窗口内(想要)至少运行一次的进程数量,并且随着时间的推移而退化”。
但是,我无法找到有关如何实际定义负载平均值的信息自由BSD。
FreeBSD 上的平均负载数字的确切含义是什么?
答案1
按照 UTSL 的传统,我粘贴了运行计算的代码。这里,nrun=sched_load()
是此时“准备运行”的进程总数,avg 指向具有 3 个定点数(1、5、15 分钟)的结构。 cexp 是使值衰减 1,5 和 15 分钟的神奇数字。作为参考,这是/usr/src/sys/kern/kern_synch.c
......我可能会推荐它作为一本引人入胜的读物。
在 FreeBSD 中,对于具有高平均负载的响应式机器,最令人惊讶的是大量进程的点唤醒会导致数字大幅膨胀。 IE:如果 400 个左右的进程都一起唤醒(Web 服务器或数据库服务器有时会这样做。)
/*
* Compute a tenex style load average of a quantity on
* 1, 5 and 15 minute intervals.
*/
static void
loadav(void *arg)
{
int i, nrun;
struct loadavg *avg;
nrun = sched_load();
avg = &averunnable;
for (i = 0; i < 3; i++)
avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
/*
* Schedule the next update to occur after 5 seconds, but add a
* random variation to avoid synchronisation with processes that
* run at regular intervals.
*/
callout_reset_sbt(&loadav_callout,
SBT_1US * (4000000 + (int)(random() % 2000001)), SBT_1US,
loadav, NULL, C_DIRECT_EXEC | C_PREL(32));
}