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: