MPM Prefork, muitos processos do apache2?

6

Eu tenho esta configuração:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit      1250
    MaxClients            1250
    MaxRequestsPerChild   1500
</IfModule>

É possibile que com um 5-10 configurações para Min / Max Servers quando eu faço top, existem toneladas de apache 2 processs ??

Eles não deveriam estar entre apenas 5-10? Basta olhar para o processo 260 dormindo O_O (d * mn apache)

Clique em link

Editar1:

Após 30min de aqui, uma tela de cima:

Clique: link

Depois de 24 horas de UP (maior ordenador para uso do MEM)

Obrigado por qualquer explicação

(debian 6, lâmpada, ram de 4 gb)

    
por dynamic 08.03.2011 / 17:25

5 respostas

11

Eu lhe dei a resposta para isso nos comentários sobre O servidor não está respondendo ao SSH e HTTP, mas o ping funciona , mas aparentemente você não acredita em mim. Realmente, é verdade!

Você precisa dimensionar MaxClients / ServerLimit no seu sistema. As "configurações 5-10 para Servidores Mín / Máx" que você mencionou são basicamente irrelevantes - isso é apenas o número de servidores extras disponíveis para não fazer nada que o Apache manterá.

Para definir MaxClients apropriadamente, observe o típico limite máximo dos processos httpd (ou apache2 ) e, em seguida, divida a memória disponível por isso. Melhor deixar cair um pouco para dar o resto da sala do sistema para respirar. Como você tem 4 GB de RAM e 185 MB de processos, isso significa que o valor de ServerLimit deve ser de 21 no máximo - provavelmente 20 ou 19.

Agora, pode ser que 190MB seja atípico. Você pode definir o ServerLimit mais alto, baseado em uma estimativa diferente do uso típico, mas então você está basicamente apostando que você nunca terá um pico. Se isso acontecer, seu sistema estará sem memória .

Se você puder encontrar uma maneira de restringir seu uso de memória por trabalhador, isso será uma vitória. Estou apostando que este é um caso de PHP Ate My RAM . Você pode codificar seu aplicativo para viver com um memory_limit mais baixo? Se você não pode fazer isso, você precisa de um modelo diferente sob o qual rodar seu PHP. Se você não puder fazer isso, precisará comprar mais RAM.

    
por 08.03.2011 / 18:04
8

O prefork MPM do Apache gerencia os servidores automaticamente. Ele sempre começará com StartServers daemons e nunca será executado em menos de MinSpareServers depois de iniciado. Ele também irá eventualmente se aposentar / matar servidores em excesso de MaxSpareServers se eles estiverem ociosos por tempo suficiente (não lembro o que "Long Enough" está neste contexto, nem se / como ele pode ser modificado).

ServerLimit define o número máximo de daemons apache que podem ser executados a qualquer momento - É por isso que na sua situação você pode ter centenas de processos do apache (eles geraram uma grande quantidade de solicitações e estive ocioso por tempo suficiente para ser morto pelo processo da mãe ainda).

Pessoalmente, acho que 1250 é um valor muito alto para ServerLimit / MaxClients - 250 pode ser um número mais razoável (embora isso possa resultar no erro ocasional 503 / Server Busy se você receber uma grande quantidade de solicitações : se isso se tornar um problema crônico, você pode aumentar o número ou adicionar mais servidores para lidar com a carga).

Relacionando essa questão com sua anterior Re: uma falha de falta de memória, definitivamente siga as orientações do Manual do Apache neste parâmetro:

Most important is that MaxClients be big enough to handle as many simultaneous
requests as you expect to receive, but small enough to assure that there is enough
physical RAM for all processes.

... e meu axioma pessoal: It's better to give a client a 503 page than knock the server down . :)

    
por 08.03.2011 / 17:43
2

Desligue Keepalives e defina MaxClients para 150. A razão mais provável é que você tem 260 processos apenas porque o Apache está mantendo as conexões do navegador abertas porque o KeepAlive on está configurado no arquivo de configuração do Apache.

    
por 08.03.2011 / 18:34
1

Calcule quantos servidores você pode ter rodando dentro das restrições da RAM do seu sistema, executando este comando:

$ ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'

Se produzirá resultados como:

Apache Memory Usage (MB): 1608.76
Average Process Size (MB): 55.4745

Agora pare o apache e descubra quanta RAM você tem disponível sem ele usando free :

               total       used       free     shared    buffers     cached
  Mem:       7629384    7415780     213604          0     333428    5341884
  -/+ buffers/cache:    1740468    5888916
  Swap:      7629380       7968    7621412

(acima está em kilobytes. free -m mostraria megabytes.)

O Linux preencherá a memória disponível com buffers e cache, portanto, adicionar free + buffers + cache (213604 + 333428 + 5341884) renderá 5888916 Kbytes disponíveis.

588916K disponíveis / 55474K por processo de apache = 106 servidores. Mas coloque mais baixo do que isso para deixar espaço para respirar.

    
por 19.10.2016 / 14:37
1

Na minha experiência, vale a pena ajustar KeepAliveTimeout após definir corretamente outros parâmetros em relação ao número de processos. Eu digo sintonizar o que significa que você deve alterar o parâmetro um pouco e medir a capacidade de resposta do servidor. Entre os nossos sites, um tem melhor desempenho com KeepAliveTimeout=3 e outro com KeepAliveTimeout=1 . Nenhum deles está satisfeito com KeepAlive desativado. Esse ajuste adicional evita que você compre / aloque RAM extra cedo demais.

O ajuste é fácil porque a mudança é efetiva imediatamente após a reinicialização:

sudo apache2ctl -k graceful

(Estou revivendo um segmento antigo porque o Google ainda considera relevante ...)))

    
por 19.10.2016 / 12:30