O servidor Apache está gerando mais e mais processos, maximizando RAM e morrendo

1

Nós temos uma configuração LAMP que funcionou muito bem durante meio ano quando o servidor Apache (servidores MySQL não estão nesta caixa) apenas começou a morrer. Parece ter começado a gerar mais e mais processos ao longo do tempo. Eventualmente, consumirá toda a memória e o servidor simplesmente morrerá. Estamos usando o prefork.

Enquanto isso, continuamos adicionando mais RAM e aumentando o parâmetro MaxClients e ServerLimit para 512. Mas estamos apenas prolongando a falha. O número ainda sobe lentamente. Talvez em um dia, atingisse esse limite.

O que está acontecendo? Nós temos apenas cerca de 15 a 20 solicitações por segundo. Temos 1 GB de memória e não é metade usado. Não há troca acontecendo.

Por que o Apache está criando mais e mais processos? É quase como se houvesse um vazamento em algum lugar!

As caixas de banco de dados estão bem, elas não estão causando um atraso nas solicitações. Nós testamos algumas consultas, tudo é rápido!

    
por erotsppa 12.06.2010 / 22:38

3 respostas

7

[<> Para o benefício de outras pessoas que se deparam com esta questão mais antiga ...]

Resposta rápida:

Verifique suas configurações de KeepAlive em seu arquivo apache2.conf ou httpd.conf. Defina seu KeepAliveTimeout entre 2-5 segundos.

Detalhes:

Descobri que, por padrão, o KeepAlive do Apache é on e o KeepAliveTimeout está definido como 15 segundos. Isso significa que o acesso de uma única página do usuário fará com que o servidor espere que o mesmo usuário solicite outra página / recurso por 15 segundos, antes que ele desista e segure a solicitação de outra pessoa.

Essa configuração é MUITO útil quando um usuário solicita o arquivo index.html inicial e depois solicita os arquivos vinculados de CSS, javascript e imagem um ou dois segundos depois. No entanto, computadores modernos e conexões de rede / internet significam que um navegador normalmente está solicitando os recursos vinculados em menos de 2 segundos. O Apache servirá as páginas subseqüentes e esperará mais 15 segundos caso o usuário deseje outra coisa. Isso é altamente ineficiente em um ambiente de alto tráfego.

Se você está recebendo 15 conexões únicas por segundo, e cada conexão permanece ativa por 15 segundos ... Tenho certeza de que você pode ver como as coisas vão ficar muito agitadas rapidamente. Você terá 225 processos do Apache girados, com 90 +% deles completamente ociosos, aguardando outra solicitação de página em sua conexão aberta.

Eu vi várias sugestões para definir seu KeepAliveTimeout em algo entre 2 e 5 segundos. Eu mesmo tenho alguns servidores tão baixos quanto 2 e outros tão altos quanto 5. Eu não recebo o mesmo sistema devagar quando recebo picos de tráfego.

    
por 23.09.2011 / 16:20
2

No seu arquivo httpd.conf , você provavelmente terá uma seção comentada que se parece com:

<IfModule mod_status.c>
        <Location "/server-status">
                SetHandler server-status
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
        </Location>
        ExtendedStatus On
</IfModule>

Ao olhar para um dos meus servidores que teve um problema com a carga ficando muito alta, posso ver um problema semelhante ... as linhas de 'SS' nunca devem ser tão altas assim:

Srv   PID    Acc       M  CPU   SS       ...  Request

0-0   22830  1/9/3640  K  2.36  7        ...  GET /[].css HTTP/1.1
1-0   79114  0/0/858   W  0.00  121462   ...  POST /cgi/[] HTTP/1.1
2-0   22856  0/1/3211  W  0.00  20       ...  POST /cgi/[] HTTP/1.1
3-0   22890  0/0/2697  W  0.00  0        ...  GET /server-status HTTP/1.0
4-0   79105  0/5/525   W  0.34  121463   ...  POST /cgi/[] HTTP/1.1
5-0   22892  1/1/764   K  0.00  6        ...  GET /[].js HTTP/1.1
6-0   22893  1/1/449   K  0.00  5        ...  GET /[].js HTTP/1.1
7-0   22894  1/1/57    K  0.00  5        ...  GET /[].js HTTP/1.1
8-0   22895  1/1/426   K  0.00  4        ...  GET /[].js HTTP/1.1
9-0   -      0/0/40    .  0.00  2        ...  OPTIONS * HTTP/1.0
10-0  22897  0/0/16    _  0.00  4        ...  OPTIONS * HTTP/1.0
11-0  22898  0/0/8     _  0.00  4        ...  OPTIONS * HTTP/1.0

(você pode precisar rolar para baixo para ver essa tabela - as tabelas superiores serão estatísticas gerais do servidor e, em seguida, uma visualização do que cada um dos filhos está fazendo no momento)

atualização : claro, isso pressupõe que algo está errado. (baseado no seu comentário de apenas 10-15 pedidos por segundo). Eu tenho alguns outros servidores onde as pessoas estão espelhando arquivos de nós, e como os arquivos são bem grandes, e há algumas pessoas que são conhecidas por abrir 500 streams com pouca largura de banda, ele consome todas as 1024 conexões, mas é perfeitamente normal e não causa um acidente.

Se você está tendo problemas com CGIs fugazes, você pode considerar usar suExec ou CGIwrap para limitar o tempo de execução, embora haja sobrecarga para usá-los.

    
por 13.06.2010 / 15:24
0

Você tem largura de banda de internet suficiente para server as respostas? As solicitações de entrada são proporcionalmente muito pequenas, então se você maximizar qualquer perna (LAN, WAN, o que for), seus servidores se acumulam tentando gravar na rede.

Verifique a fila de envio pelo comando netstat (1) do seu sistema. por exemplo, "netstat -nat" e observe a coluna send Q. Se você tem muitos dados de saída que são um sinal de que há um gargalo em algum ponto da rede (além da placa de rede física).

    
por 23.09.2011 / 20:48