Ajustando o Apache2 prefork MaxClients ServerLimit

22

Eu tenho uma máquina com 128 GB de RAM que usa o Apache2 como servidor da Web (nesta máquina não há servidor de banco de dados, a máquina de banco de dados é uma máquina de 64 GB que pode lidar com 2000 conexões máximas). Vejo com uma ferramenta de monitoramento que atualmente existem cerca de 44 trabalhadores ocupados e 12 trabalhadores ociosos, quais são os melhores valores teóricos para o meu módulo pré-fork?

às vezes, recebia páginas em branco carregando sites em horários de alta carga e recebia esse erro no meu log de erros do apache:

[aviso] criança pid 13595 sinal de saída Falha na segmentação (11)

como pode resolver esse problema também?

Minha configuração do módulo Apache2 Prefork:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Livre -h na máquina www :

total: 128 G grátis: 97 GB (com o apache2 em execução) buffers 0b compartilhados 1.9G cache 23G

Ram usado pelo Apache2 e outros programas:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB
Usuário-N
fonte
2
Qual é o código do aplicativo em execução no servidor da web? Esse provavelmente é o culpado.
Shane Madden
envie algumas amostras do status apache2ctl; existe algo em error_log talvez?
Hrvoje Špoljar

Respostas:

63

Configurações de pré-fork do Apache, diretrizes de ajuste de desempenho por apache

citar:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

você deve configurá-lo assim com base em sua entrada para:

  • Memória total: 128 GB
  • -10% de memória para tudo, exceto o apache: 115 GB
  • Agora precisamos descobrir quanto processo único do apache está usando.

Para calcular isso, você pode usar o seguinte script:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

Essa é a melhor estimativa de quanto processo único do apache está usando memória ao tentar dividir proporcionalmente o uso compartilhado por número de processos ativos do apache e incluí-lo sobre os Pss (tamanho proporcional do conjunto)

Finalmente, você divide 115 GB com esse valor e recebe MaxClients/ServerLimit. A partir daqui, você pode calcular relativamente outros números, como

  • StartServers 30% dos clientes MaxCl
  • MinSpareServers 5% dos clientes MaxCl
  • MaxSpareServers 10% dos clientes MaxCl
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (como alternativa conservadora para resolver um possível problema com aplicativos com vazamento de memória)
Hrvoje Špoljar
fonte
2
Espero que alguém com mais pontos de representação que eu lhe dê voto nesta resposta, muito obrigado!
Utilizador-N
2
Seu script de cálculo fornece 842,13 MB. Isso é uma ordem de magnitude acima do que eu faria (apache 2.2 no CentOS 6.7).
Quinn Comendant
1
Está no modo prefork. Aqui está a saída de /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant wicked trick, no entanto, o IfModule será verdadeiro se o módulo prefork estiver disponível (o que é) e, na verdade, ambas as opções estiverem disponíveis worker e MPM ... Eu tenho servidor idêntico e uso de memória no meu sistema para o trabalhador é ~ 850 MB. Não há como o prefork pode usar para 1 processo de 800 MB de memória. Você alterou a linha no script onde faz referência ao nome do processo apache2 para httpd, certo?
Hrvoje Špoljar 27/10/2015
1
@ Shawn, por que você diria isso? como você acha que deve ser calculado?
Hrvoje Špoljar