Alta carga no servidor [fechada]

1

Eu tenho um servidor dedicado de cpanel LAMP e tenho tido problemas de carregamento nos últimos 2 dias.

É assim que o meu top parece (classificado por M):

top - 14:26:04 up 1 day,  1:08,  2 users,  load average: 33.10, 36.63, 38.92
Tasks: 359 total,   1 running, 355 sleeping,   1 stopped,   2 zombie
Cpu(s):  4.2%us,  0.8%sy,  0.0%ni, 13.6%id, 81.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   1034896k total,   998084k used,    36812k free,     8716k buffers
Swap:  2040212k total,  1606552k used,   433660k free,    87388k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5088 mysql     15   0  336m 106m 3868 S  1.3 10.6 310:15.37 mysqld
15797 nobody    18   0  331m  65m 1988 S  3.0  6.4   0:04.64 httpd
15635 nobody    19   0  371m  63m 1840 S  0.0  6.3   0:00.88 httpd
15664 nobody    18   0  374m  63m 1832 S  1.3  6.2   0:00.43 httpd
15769 nobody    19   0  336m  59m 1700 S  0.0  5.9   0:00.29 httpd
15721 nobody    18   0  324m  59m 1732 S  1.0  5.9   0:00.29 httpd
15697 nobody    18   0  304m  59m 1692 S  0.0  5.8   0:00.46 httpd

iostat é:

Linux 2.6.18-164.15.1.el5 (hostname)   05/20/2011

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          21.93    0.33    4.91   12.03    0.00   60.79

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              65.16      1069.51      1285.65   96981151  116580545
sda1              0.00         0.03         0.00       3023         31
sda2             18.59       444.95       159.37   40347535   14451402
sda3              7.15       129.47       113.45   11740498   10287608
sda4              0.00         0.00         0.00          6          0
sda5              1.25        12.88        44.49    1167658    4034632
sda6              3.92        11.25       525.79    1020250   47677744
sda7              5.56       108.71        96.29    9857739    8731832
sda8             28.70       362.20       346.25   32843994   31397296

O Mysql parece ter muitos processos em execução (está constantemente em "Excesso de conexões"). Nenhum dos meus sites parece ter muito tráfego e não vejo consultas específicas levando mais do que outras.

Poderia, por favor, propor uma maneira de depurar / lidar com essa situação?

    
por vassilis 20.05.2011 / 13:33

5 respostas

3

Eu diria que seus problemas de carga são decorrentes do uso excessivo de espaço de troca devido à falta de memória. Assim que seus aplicativos usarem toda a RAM disponível (1 GB), eles começarão a usar o espaço de troca (1,6 de 2 GB usado), o que aumentará sua carga de IO (81,0% wa).

Você quase nunca quer que seu servidor LAMP tenha que usar o espaço de troca, pois, como você percebeu, isso prejudica completamente o desempenho do servidor. Para não usar o swap, você precisa limitar o uso de memória do seu aplicativo:

  • Reduza o número máximo de clientes Apache, normalmente com MaxClients . Com apenas 1GB de RAM você provavelmente quer limitar o Apache a usar 500MB ou menos, o que significa que MaxClients de apenas 8 pode ser necessário (500MB / 60MB por processo = 8). Você pode jogar com esse número e, se o servidor começar a trocar, reduza-o e reinicie o Apache.
  • Possivelmente reduza o uso de memória do MySQL. Já que você só tem 1GB de RAM, você pode querer limitar o uso do MySQL. De sua saída superior, parece bem no momento, mas se aumentar muito, você pode ter que jogar com a configuração. A "quantia certa" de RAM para dar ao MySQL depende do banco de dados e do aplicativo. Eu poderia dar um pesado aplicativo de 500MB mas um muito leve apenas 50MB.
  • Monitore o uso da memória em todos os outros aplicativos em execução. Ter apenas 1 GB em um servidor LAMP limita a quantidade de memória que você pode fornecer para tudo o que, em última análise, limitará sua capacidade de servir.
por 20.05.2011 / 18:31
1
Cpu(s):  4.2%us,  0.8%sy,  0.0%ni, 13.6%id, 81.0%wa,  0.0%hi,  0.3%si,  0.0%st

Veja o valor muito alto para wa ? Esse é o seu problema. Você está tendo uma contenção de IO muito alta e tem muitos processos em espera na fila do agendador, esperando que o I / O do disco aconteça.

Eu recomendaria passar algum tempo examinando sua situação no disco. É provável que você precise adicionar fusos adicionais ou discos mais rápidos.

    
por 20.05.2011 / 15:19
1

A espera de IO é super alta. Não é possível determinar a partir do topo e o iostat gera o que está matando o disco. Eu rodaria o iotop para ver se você pode encontrar o culpado do IO.

Verifique também "show full processlist" no MySQL para ter uma ideia de quais consultas estão sendo executadas. Pode ser uma ou mais consultas que atrapalham as coisas.

Por fim, habilite o status do servidor no Apache e verifique os logs de acesso para obter uma visão do que o Apache está tentando fazer. Talvez alguém esteja raspando de novo e de novo?

O seguinte pode indicar se você está sendo atingido por um host. Ele deve exibir todas as conexões atuais para a porta 80, ordenadas pela contagem

netstat -anp |awk '/:80/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
    
por 20.05.2011 / 16:14
0

"Muitas conexões" - significa que você precisa aumentar o valor de max_connections no mysql config. Pode ser o resultado de muitos processos do apache tentando se conectar ao servidor mysql e ficarem presos quando atingirem o limite do mysql max_connections. Pode ser que o lado do aplicativo não feche a conexão corretamente ou, se for normal, você precisa aumentar os limites. Eu acho que você precisa monitorar de onde as conexões do mysql vêm, e como o seu aplicativo manipula / fecha as conexões do mysql.

    
por 20.05.2011 / 13:51
0

Obrigado a todos pelas respostas. Eles eram todos válidos e úteis.

O verdadeiro culpado foi realmente cpanellogd - o processo que o cpanel executa para girar e criar estatísticas fora dos registros de acesso.

Isso estava programado para ser executado apenas à noite, mas, por algum motivo, estava começando no meio do dia, quando estamos tendo mais carga.

    
por 22.05.2011 / 12:32