FreeBSD에서 로드 평균은 어떻게 계산됩니까?

FreeBSD에서 로드 평균은 어떻게 계산됩니까?

Linux에서 로드 평균은 지난 1분, 5분, 15분 동안 실행되거나 대기할 수 있는 평균 프로세스 수입니다.

OpenBSD에서 (그리고가능한다른 BSD에도 있지만 인용문이나 문맥에서 실제로 그런 내용은 나와 있지 않습니다.)부하 평균"마지막 5초 동안 한 번 이상 실행되고 시간이 지남에 따라 성능이 저하되는(원하는) 프로세스 수"입니다.

하지만 실제로 부하 평균을 정의하는 방법에 대한 정보를 찾을 수 없습니다.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개 정도의 프로세스가 모두 함께 깨어나는 경우(웹 서버나 데이터베이스 서버가 가끔 이렇게 합니다.)

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

관련 정보