Reduzindo o uso de memória VIRT e RES do Apache

1

Em um servidor de quatro núcleos com 8 GB de RAM, tenho processos do Apache que usam até 2,3 GB de memória RES e 2,6 GB de memória VIRT. Aqui está uma cópia do top -c command :

Existe uma maneira de reduzir o uso de memória para esses processos do apache?

Estas são minhas configurações httpd.conf :

Timeout 160
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6
<IfModule prefork.c>
MinSpareServers 4
MaxSpareServers 16
</IfModule>
ServerLimit 400
MaxClients 320
MaxRequestsPerChild 10000
KeepAlive On
KeepAliveTimeout 4
MaxKeepAliveRequests 80

Nota : parece haver algum atraso na conexão. Além disso, se 16 conexões estiverem usando 8 GB ou ram. Estou um pouco preocupado que, se meu servidor obtiver 300 conexões, ele ficará off-line. Também em Munin eu posso ver a memória comprometida subir de alguns GB para 80 GB em 2 semanas. Com cada reinício do apache, ele desce para alguns GB novamente

    
por lisa 19.09.2011 / 14:10

4 respostas

1

A memória no Apache é usada pelos módulos e pela memória usada pelos módulos. Desabilite os módulos não utilizados e veja qual o restante que você precisa ajustar use pmap <PID> para ver como a memória foi alocada. Use dmalloc e valgrind para depurar os problemas de alocação de memória restantes.

    
por 19.09.2011 / 14:22
0

Isso é um uso de memória excepcionalmente alto. Pode haver um vazamento de memória .

Por enquanto, tente atualizar sua instalação do Apache2 (incluindo módulos) e reduza o número de MaxRequestsPerChild , ou seja, para 500. A última configuração reduz essencialmente a vida útil máxima dos subprocessos do Apache2 em termos de "solicitações processadas". Ou seja, se houver vazamentos de memória, eles não se acumularão tão drasticamente.

    
por 19.09.2011 / 14:23
0

Remover módulos desnecessários é a solução básica para o problema, mas você precisa estar executando um grupo insano de módulos para obter um processo Apache que consuma 2 GB de RAM. É muito mais provável que você tenha módulos de código dinâmicos (como mod_php ) que executam código ruim, ou um módulo que está mal codificado e vazando memória.

Você pode colocar MaxRequestsPerChild em algo muito pequeno ou pode executar o trabalho corretamente e encontrar vazamentos de memória. Um meio termo é, pelo menos, empurrar a execução dinâmica do código para um processo separado (usando suPHP, suexec, php-fpm, etc), o que é uma boa ideia de qualquer maneira para fins de segurança.

    
por 19.09.2011 / 14:24
0

Não sei que tipo de tráfego você está vendo que exigiria essas configurações, mas parece que suas configurações podem ser reduzidas para aproveitar melhor os recursos, pois parece que você está supercomprometendo o Apache desde o início ; não tem configurado para tráfego de site realista. A menos que você possa fornecer algumas estatísticas do site que justifiquem os altos números da configuração inicial.

A chave é MaxRequestsPerChild , o que ajuda a evitar vazamentos de memória ao gerar novamente processos pai com mais frequência. Além disso, abaixei ServerLimit e MaxClients , pois isso está relacionado a quantos clientes estão conectados POR SEGUNDO. Então, se alguém pegar uma página do seu site e renderizar em 1 segundo, adivinhe? O servidor fez o trabalho. Relacionado a isso, reduzi o MaxKeepAliveRequests e o KeepAliveTimeout para ser mais realista novamente. Eu também abaixei o% geralTimeout desde que 120 segundos são 2 minutos. Se um cliente estiver demorando 2 minutos para obter conteúdo de você que é mais do que uma quantidade generosa de tempo para fornecê-lo antes que o servidor atinja o tempo limite. Eu gosto de manter esse número no lugar apenas no caso de um cenário de alto tráfego chegar.

Lembre-se: um servidor da web não mantém uma conexão constante entre o servidor e o cliente. Um cliente faz uma solicitação, o servidor entrega a página e é isso. Então, sintonize isso em mente. Além disso, leia essa outra resposta Eu forneci para outro pôster que estava preocupado com o uso de memória em seu servidor web.

Timeout 120
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6

<IfModule prefork.c>
  MinSpareServers 4
  MaxSpareServers 16
</IfModule>

ServerLimit 80
MaxClients 60
MaxRequestsPerChild 2000
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 30
    
por 09.11.2013 / 06:34