Por que há alta carga na minha CPU se o uso de% cpu estiver baixo e a% de memória estiver baixa?

1

Eu tenho um servidor em nuvem Rackspace rodando o Ubuntu com 2GB de memória que está sendo usado como servidor de aplicativos (os arquivos HTML e PHP são carregados deste servidor e o banco de dados mysql está em outro servidor no mesmo datacenter).

Quando o número de usuários do meu aplicativo da web aumenta (10.000 + / dia), o carregamento sobe para 1,00 e, às vezes, para 2,00. Isso faz sentido logicamente, mas não consigo encontrar de onde o gargalo está vindo. Usando o comando "top", vejo que o uso da CPU é quase 1% quase todo o tempo, e usa apenas cerca de 500 MB do total de memória de 2 GB (quase todos para processos do apache). Eu também tenho munin instalado e parece que esses números são aproximadamente precisos para o dia inteiro (não há grandes picos em qualquer estatística).

Se não é a CPU ou a memória que é o problema, do que devo monitorar e / ou otimizar para se preparar para um tráfego maior? (Eu não sei o que melhorar, pois não sei a causa da carga!)

Obrigado! Por favor, deixe-me saber se você precisar de alguma outra informação sobre a configuração do meu servidor.

    
por eric 03.12.2010 / 01:46

3 respostas

2

"Load" vem de mais do que apenas utilização da CPU. É o número de processos que estão aguardando recursos.

A primeira coisa que você precisa fazer é descobrir se isso está causando algum impacto no aplicativo que está sendo veiculado. Uma carga de menos do que o número de CPUs que você tem normalmente é considerada boa.

Quando você está vendo isso, o que o top diz sobre o seu iowait?
O que free -m mostra?

Você também pode querer dar uma olhada no iostat.

    
por 03.12.2010 / 02:11
2

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.

    
por 03.12.2010 / 03:05
0

Monitora as operações de E / S do disco e os tamanhos das operações de E / S do disco.

Isso lhe dirá

  1. Onde estão os afunilamentos (por exemplo, muitas operações de leitura de E / S / segundo ou algumas gravações muito grandes.), que informam
  2. Quais alterações você deve fazer para melhorar o desempenho (por exemplo, alterar para um array RAID10 ou alternar para SSDs).

Não sei qual controle você tem sobre a configuração do disco em seu ambiente, mas parece que esse é o seu gargalo.

    
por 03.12.2010 / 03:58