O valor alto do MaxClient pode causar problemas de carga da CPU, independentemente do estresse real do servidor causado pelas visitas?

3

I thought MaxClients is just a limit and when the server hits the limit, it shows blank pages for some people preventing the overload. Also I thought it's just a limit, so the spare connections aren't used unless they are needed and they are freed after that. But my server machine seems to deny all this.

Vários meses atrás, onde repetidamente "considerei o aumento de MaxClient" no log do servidor do Apache. Antes de perceber o que está acontecendo, o servidor acumulou a carga da CPU e, em seguida, a máquina falhou completamente. Isso acontece três vezes em cerca de uma semana antes de eu aumentar o valor de MaxClient de 500 para 900 (MPM prefork).

[Última falha *] Muito tempo depois, há duas semanas, houve um pico de conexão causado por visitas reais (publicamos algumas informações "exclusivas"). Ele provavelmente atinge o limite de 900 (ele apareceu uma vez no log), o servidor começa a ficar atrasado e em questão de minutos ele falha novamente. Isso termina com 2 horas de blecaute (o sistema de arquivos foi corrompido).

Então agora eu tenho MaxClient = 2000, mas o problema que tive, apareceu dias antes do [Last crash *]. Então, na verdade, não sei se é relevante.

Estes são meus sintomas:

  • aumento de carga da CPU aleatória (até 12, carga normal abaixo de 5) até reiniciar o Apache, depois que a carga de reinicialização cai rapidamente
  • após a reinicialização, leva de horas a dias até que apareça novamente
  • esse aumento de carga parece adicionar "5" à carga existente, ou seja, de manhã é aprox. 2 + 5 e se eu não reiniciar o Apache, ele aumentará com visitas reais (12-14 no pico)
  • quando atinge o pico, ele não cai, fica lá até reiniciar, não importa a hora do dia ou as visitas reais
  • parece que os problemas de carregamento começam em horários aleatórios, picos, noite, manhã, segunda-feira, sábado não importa
  • essa carga não parece afetar o desempenho (mas eu não gosto disso, se nada mais, está diminuindo o tempo de vida da CPU)
  • a carga é causada pelo Apache com certeza (top, htop verifica isso)

Esta é minha configuração prefork do MPM (24 GB de RAM, dados do Apache + MySQL +):

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit   2000
MaxClients         2000
MaxRequestsPerChild   0

Também tenho o KeepAlive desligado. Isso poderia ter algum papel nesse comportamento?

KeepAlive Off
MaxKeepAliveRequests 0
KeepAliveTimeout 2

Do status do servidor: 40 solicitações sendo processadas atualmente, 0 (ou até 12) funcionários ociosos agora. É sábado à noite tho. Agora eu estou recebendo números muito semelhantes, mas é domingo de sol meio dia ... droga xD

Primeiro eu pensei que era um script php defeituoso, mas não tenho certeza sobre nada agora. Ninguém parece mudar qualquer script quando o problema apareceu pela primeira vez. E o estranho comportamento de colisão ao atingir o limite me diz que pode haver algo totalmente errado (especialmente quando o valor crescente ajuda, não parece falta de memória).

Sinto muito pela descrição exaustiva. Eu não costumo perguntar antes da pesquisa, mas eu realmente fiquei sem ideias hoje. Eu não posso continuar reiniciando o tempo todo. Esses 2 segundos não importam, mas há também a chance de algum roteiro principal não conseguir terminar seu trabalho corretamente ou o editor perder o trabalho ao pressionar o botão salvar no momento errado.

Então, para simplificar, eu também gostaria de saber sua opinião sobre a configuração do meu Apache, se é possível que isso tenha alguma relevância com meus problemas de carga.

    
por Saix 18.03.2012 / 13:00

3 respostas

3

Mesmo com 24 GB de RAM, seu MaxClients provavelmente está muito alto. Isto é o que eu uso para uma aproximação do tamanho médio do processo de httpd (substituto do apache2 se em distribuição da Debian):

ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'

Depois de ter esse número, digamos 90% da RAM do sistema (supondo que esse servidor esteja servindo apenas tráfego da Web e não tenha MySQL e outros serviços nele) e divida pelo tamanho médio do processo httpd, por exemplo:

22,118 MB / 50 = 442

Então você configuraria MaxClients (e ServerLimit) para cerca de 440.

Já que você tem o MySQL neste servidor, você precisaria ser mais conservador, talvez pegar 50% da RAM do sistema e dividi-lo pelo tamanho médio do processo httpd, resultando em um MaxClients de 245.

    
por 18.03.2012 / 13:19
1

Tente isto:

Timeout     300
KeepAlive   On
MaxKeepAliveRequests    28800
KeepAliveTimeout    260
ListenBackLog   default
StartServers    4
ServerLimit     16
ThreadLimit     2048
MaxClients  2048
MinSpareThreads     32
MaxSpareThreads     64
ThreadsPerChild     128
MaxRequestsPerChild     0
    
por 18.05.2012 / 16:58
0

Como solução alternativa, você pode tentar definir MaxRequestsPerChild como um valor diferente de zero.

    
por 18.03.2012 / 13:16

Tags