Uso pesado de memória do Apache

2

Recentemente eu notei que os processos do httpd começaram a consumir grandes quantidades de memória - depois de algum tempo praticamente usando quase todos os 2GB de RAM que o servidor tem e eu não tenho mais memória para outras coisas. Aqui está o que o top me diz:

26409 apache 15 0 276m 152m 28m S 0 7.4 0:59.12 httpd
26408 apache 15 0 278m 151m 28m S 0 7.4 1:03.80 httpd
26410 apache 15 0 277m 149m 26m S 0 7.3 0:57.22 httpd
26405 apache 15 0 276m 148m 25m S 0 7.3 0:59.20 httpd
26411 apache 16 0 276m 146m 23m S 0 7.2 1:09.18 httpd
17549 apache 15 0 276m 144m 23m S 0 7.0 0:36.34 httpd
22095 apache 15 0 276m 136m 14m S 0 6.6 0:30.56 httpd

Parece-me que cada processo de httpd não liberta a memória depois de processar um pedido. Então todos eles sentam ~ 270MB que é ruim. Existe uma maneira de eu saber para onde vai toda a memória e por que fica assim? Eu não fiz nenhum ajuste de servidor ultimamente, então tenho certeza que não fui eu quem estragou algo (não tive o problema antes).

O servidor é usado para servir aplicativos PHP.

EDIT: O Apache é configurado com o módulo prefork e o MaxRequestsPerChild é definido para 4000.

    
por Ree 16.01.2010 / 13:24

2 respostas

5

A solução rápida é usar MaxRequestsPerChild (number) (por exemplo, 10000) para que o Apache reinicie cada trabalhador após várias solicitações. Isso descartará a memória usada quando for reiniciada.

O número de 276m não é o quanto cada processo está usando. Uma explicação dos valores mostrados em 'top' é útil aqui:

VIRT : imagem virtual (kb) A quantidade total de memória virtual usada pela tarefa. Inclui todo o código, dados e bibliotecas compartilhadas, além de páginas que foram trocadas. (se você estiver usando o APC, o espaço de memória usado por ele também será incluído neste valor)

RES : tamanho do residente (kb) A memória física não trocada que uma tarefa usou.

SHR : tamanho do Mem. Compartilhado (kb) A quantidade de memória compartilhada usada por uma tarefa. Ele simplesmente reflete a memória que poderia ser potencialmente compartilhada com outros processos.

Em 'top', você pode adicionar uma coluna 'data' Dados : dados + tamanho da pilha (kb) A quantidade de memória física dedicada a outro código que não seja o executável, também conhecido como tamanho "conjunto de residentes de dados" ou DRS.

Esse valor 'Data' corresponde mais de perto à memória exclusiva usada por esse processo em particular, o que provavelmente não é muito. Somando esses 276M e obtendo um número próximo de 2GB significa que você está contando um monte de coisas.

    
por 16.01.2010 / 13:52
1

Por favor, poste uma imagem completa da parte superior, em vez de apenas os processos do httpd (filtre-o pelo usuário apache , se quiser).

As seções Mem e Swap no topo mostram muitas informações úteis aqui - por exemplo, o seguinte é de um dos meus sistemas:

Mem:  16415160k total, 16360604k used,    54556k free,   173948k buffers
Swap: 16779768k total,    28700k used, 16751068k free,  5006768k cached

Parece que toda a memória em uso não é - todos os 16Gb!?!

Na verdade, isso é bom porque, como você pode ver, o sistema não está usando (praticamente) nenhum espaço de troca, e 5Gb de memória está em uso como cache.

O que acontece no Linux é que, se houver alguma memória livre disponível, o kernel alocará o cache do sistema de arquivos e o buffer de E / S. Isso permite que o sistema recupere dados do sistema de arquivos da memória, em vez de ter que ler do disco a cada vez. Se um processo precisar de memória, o cache diminuirá um pouquinho e a memória será alocada para o processo.

    
por 19.02.2010 / 11:47