Como é calculada a média de carga no osx? Parece muito alto - e como analiso isso?

7

Uma pergunta avançada: Acho que minhas médias de carga são muito altas em comparação com um sistema Linux. Eu tenho em torno de 0,40 1min com basicamente sem uso de CPU (0-1%) e mesmo se este é espalhado por 4 núcleos ainda é igual a cerca de 0,10 = 10% cpu uso que não está correto. Agora eu aprendi que a média de carga leva não apenas o uso da CPU em conta, mas também o io para o disco e a rede. Eu, portanto, tentei encontrar o valor de espera de io mas isso parece não estar disponível no mac por algum motivo? Eu tenho US e SY e ID, claro, na ferramenta iostat, mas nenhum sinal de io wait% (chamado WI se eu não me lembro errado).

Tudo está bem e eu tenho as mesmas médias de carga nos meus outros macs, o que eu estou procurando aqui é entender por que as médias são calculadas dessa maneira (tão alta) e como eu posso analisá-la ainda mais?

Eu pesquisei boas duas horas no tópico, mas há pouco ou nenhum falando sobre isso, alguma idéia?

    
por Kristian Erik Tigersjäl 22.12.2011 / 13:49

1 resposta

12

A carga é o número médio de processos executáveis. man 3 getloadavg diz:

The getloadavg() function returns the number of processes in the system run queue averaged over various periods of time. Up to nelem samples are retrieved and assigned to successive elements of loadavg[].
The system imposes a maximum of 3 samples, representing averages over the last 1, 5, and 15 minutes, respectively.

Você também pode obter as mesmas informações executando sysctl vm.loadavg .

Assumindo que o Mac OS X 10.7.2, a função getloadavg chama este código aqui (procure pela segunda ocorrência de sysctl_loadavg ), que, em essência, retorna o valor atual de averunnable .

Isso, por sua vez, é definido aqui :

struct loadavg averunnable =
    { {0, 0, 0}, FSCALE };      /* load average, of runnable procs */

Este arquivo também define compute_averunnable , que calcula o novo valor ponderado de averunnable .

O arquivo de cabeçalho do agendador sched.h declara como extern , e todas as implementações do planejador em xnu-1699.24.8/osfmk/kern/sched_*.c periodicamente o chamam por compute_averages em sched_average.c .

O argumento para compute_averunnable , é sched_nrun em sched_average.c , obtendo seu valor de sched_run_count em sched.h .

Este número é modificado pelas macros sched_run_incr e sched_run_decr , usadas exclusivamente no arquivo sched_prim.c , que são as primitivas de agendamento responsáveis por desbloquear, despachar etc. tópicos.

Então, para recapitular:

Ele simplesmente usa o número de threads executáveis para calcular as médias de carga em intervalos de 5 segundos.

Embora os sistemas sejam totalmente diferentes, acho difícil acreditar que o Linux tenha sempre cargas menores que o OS X. De fato, parece que o Linux simplesmente mostra um valor diferente .

Citando Wikipedia :

On modern UNIX systems, the treatment of threading with respect to load averages varies. Some systems treat threads as processes for the purposes of load average calculation: each thread waiting to run will add 1 to the load. However, other systems, especially systems implementing so-called N:M threading, use different strategies, such as counting the process exactly once for the purpose of load (regardless of the number of threads), or counting only threads currently exposed by the user-thread scheduler to the kernel, which may depend on the level of concurrency set on the process.

A julgar pelo artigo , o Linux realmente usa o número de processos que são executáveis ao contrário dos threads do XNU.

Como cada processo executável tem pelo menos um thread executável, os valores médios de carga no OS X irão, assumindo um cálculo de média de carga equivalente (que não me preocupei em verificar), sempre em menos grande, já que as contagens de itens nas quais elas são baseadas são diferentes.

    
por 30.12.2011 / 21:41