FreeBSDでは、負荷平均はどのように計算されますか?

FreeBSDでは、負荷平均はどのように計算されますか?

Linuxでは、負荷平均は、過去1分、5分、15分間実行または待機できる平均プロセスの数です。

OpenBSDから(そして可能他のBSDにもありますが、引用文や文脈で実際にそのような内容は示されていません.)負荷平均「最後の5秒間に1回以上実行され、時間の経過とともにパフォーマンスが低下する(必要な)プロセス数」です。

しかし、実際に負荷平均を定義する方法に関する情報は見つかりません。FreeBSD

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

関連情報