FreeBSD 上的平均负载是如何计算的?

FreeBSD 上的平均负载是如何计算的?

在 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));
}

相关内容