Minha configuração do Apache2 está vazando memória?

5

Recentemente, notei que o meu apache usa quantidades absurdas de memória no meu servidor Linode (80MB a mais do que costumava), e reiniciar o apache2 parece corrigir o problema.

Eu executo o SVN sobre o apache, assim como o mysql e o tomcat no servidor, mas nenhum deles parece ser o problema. Como faço para depurar onde o apache está perdendo memória? Além do SVN, ele realmente hospeda apenas um blog wordpress, então não vejo onde o vazamento poderia estar ocorrendo. Eu usei uma instalação padrão dos repositórios do Ubuntu 8.04.

Alguma ajuda?

    
por Stefan Kendall 23.11.2009 / 20:26

1 resposta

5

Uma nuance do manuseio de memória do Apache significa que ele sempre parece estar comendo mais e mais memória - o valor de VIRT do topo é geralmente alto quando se usa prefork.c (que eu presumo que você seja):

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10385 apache    15   0  376m  48m 3932 R 20.3  1.2   0:01.34 httpd
10423 apache    16   0  376m  46m 4576 S 15.0  1.2   0:01.09 httpd
10153 apache    15   0  337m  61m 4672 S 11.6  1.6   0:03.94 httpd
10419 apache    15   0  383m  54m 4696 S 11.6  1.4   0:01.00 httpd

O valor que você deseja monitorar é RES - esse é o tamanho da maior quantidade de memória que o segmento filho consumiu (no meu caso, o PHP é executado como parte desse encadeamento, daí o "inchaço" como bibliotecas e dados são carregados). O encadeamento não libera a memória alocada, no entanto, quando o processo do apache mata o encadeamento após seus maxrequests conforme

<IfModule prefork.c>
MaxRequestsPerChild  1000

o encadeamento retornará ao consumo de memória nativa. Este é o mesmo efeito que reinicializar o apache, embora uma reinicialização envolva uma perda temporária de serviço (nada está escutando na porta 80) enquanto MaxRequestsPerChild controla somente threads filho, assegurando que ainda haja um serviço escutando na porta 80 (ou onde quer que esteja configurado para escute).

Para diminuir o uso total de memória do apache, certifique-se de carregar apenas os módulos do apache necessários e monitorar os threads do apache enquanto executa um script PHP muito grande ( ini_set('memory_limit', '128M'); e depois recursivamente carregar dados em uma matriz - isso deve acontecer) . Em seguida, durante o uso no mundo real, diminua o valor de MaxRequestsPerChild até ver seu apache RES em um nível razoável. Não esqueça que isso está apenas diminuindo a possibilidade de um thread filho executar um script grande no início de sua "vida" (quanto mais filhos fizerem isso, mais memória total o apache usa),

Aqui estão alguns artigos de ajuste de parâmetros úteis:

por 23.11.2009 / 21:54