Como a média de carga é calculada no FreeBSD?

3

No Linux, a média de carga é o número médio de processos que podem ser executados ou aguardados em média nos últimos 1, 5 e 15 minutos.

No OpenBSD (e possivelmente outros BSDs, mas nem a citação nem o contexto realmente dizem), média de carregamento é" o número de processos que (queriam) foram executados pelo menos uma vez na janela mais recente de 5 segundos, com uma degradação ao longo do tempo ".

No entanto, não consegui localizar informações sobre como a média de carga é realmente definida no FreeBSD .

Qual é o significado exato dos números médios de carga no FreeBSD?

    
por a CVn 01.02.2017 / 11:21

1 resposta

1

Na tradição da UTSL, colei no código que executa o cálculo. Aqui, nrun=sched_load() é o total de processos "prontos para execução" neste instante e avg está apontando para uma estrutura com 3 números de ponto fixo (1,5,15 minutos). cexp são números mágicos para decair os valores por 1,5 e 15 minutos. Para referência, isso é em /usr/src/sys/kern/kern_synch.c ... que eu poderia recomendar como uma leitura fascinante.

No FreeBSD, o que mais surpreende as pessoas em relação às máquinas responsivas com altas médias de carga é que o despertar de um grande número de processos pode aumentar bastante os números. IE: se 400-ish processa todos os acordados juntos (servidores web ou servidores de banco de dados, às vezes, fazem isso.)

/*
 * 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));
}
    
por 06.02.2017 / 03:31