Os processos podem estar em um dos vários estados no planejador do Linux. Os kernels mais recentes têm alguns mais sofisticados, mas os básicos são (de include/linux/sched.h
):
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_STOPPED 4
O primeiro deve ser óbvio; as últimas são as tarefas que foram realmente interrompidas. O estado interruptível é para tarefas que estão dormindo. Tarefas ininterruptas geralmente estão esperando em um recurso do sistema - como disco ou outro IO.
Presumivelmente, como geralmente espera-se que as tarefas ininterruptas sejam programadas muito em breve, elas são contadas como estando na fila de execução.
E os números loadavg que você vê em /proc/loadavg
(e em top
e outras ferramentas) são simplesmente o tamanho médio dessa fila de execução - os processos aguardando para serem agendados - por 1, 5 e 15 minutos intervalos. Se você tem muitos processos realmente em TASK_RUNNING, isso aumentará o loadavg, mas os processos presos no TASK_UNINTERRUPTIBLE também o farão. (Na verdade, na minha experiência, isso é geralmente o culpado por trás de números de carga ridiculamente altos.)
Então, se você está vendo carga alta sem muito uso da CPU, você quer procurar o io. iotop
é uma ferramenta útil para isso. Isto requer o kernel 2.6.20, no entanto. Em sistemas mais antigos, ou apenas para uma exibição alternativa, iostat
(do sysstat
package) e vmstat
(de procps
) podem mostrar algumas estatísticas gerais. Como alternativa, se você estiver usando o NFS, um processo travado pode na verdade estar fazendo muito pouco real, mas ainda assim ficar bloqueado. (Yay NFS.)
Se você não estiver vendo nada disso, algo pode estar errado na infraestrutura da máquina virtual.