Httpd processa usando mais memória ao longo do tempo

1

Estou usando um servidor VPS Centos 6 de memória de 3GB. Se eu reinicializá-lo, recebo cerca de 4 ou 5 serviços httpd em execução e todos eles usam cerca de 2,5% de memória (86m na coluna res do comando superior).

Estou executando apenas um site que ainda não está ativo, por isso sou o único que está se conectando a ele.

No entanto, todos os dias vejo que a porcentagem de memória httpd sobe em 0.3 ou 0.4 depende. O que significa que depois de 4 ou 5 dias esses processos httpd estarão usando cerca de 4% de memória (130m na coluna res do comando top) .Não vejo nenhum erro nos logs e tudo funciona corretamente mas se eu saísse do servidor sem reiniciando por 2 semanas, ficarei sem memória.

Por exemplo, uma maneira de reproduzi-lo será usar o comando ab.Por exemplo, se eu executar:

ab -c 2000 -t 60 http://xxx.xxx.xxx.xxx/

Após a execução, cada um dos serviços do httpd usará cerca de 0,3 ou 0,4 mais memória do que antes de executar o teste.

Novamente, não vejo erros nos registros.

Isso é normal?

Eu tenho feito mais testes e pesquisas. Meus valores:

KeepAlive Off

<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit        15
MaxClients        15
MaxRequestsPerChild  2000
</IfModule>

O que parece estar ok e eu sempre tenho cerca de 500MB de memória de sobra (pelo menos quando o servidor é apenas reinicializado). O problema é que os cinco processos do httpd que estão sempre ativos continuam aumentando de tamanho assim quando o tráfego atinge o servidor e mais processos filhos são criados eles obtêm o tamanho do processo pai httpd.Então, se os processos pai do httpd forem 120mb, todos os processos filhos serão de 120mb.Então, não importa quão pequeno seja o MaxRequestsPerChild, porque um novo processo filho será criado que vai ter tanta memória quanto a anterior. Qualquer conselho?

    
por javi 05.06.2013 / 16:53

3 respostas

2

Você não diz qual software de servidor da Web está usando. Se você está falando sobre o apache embora (e parece provável com um modelo multi-processo), então você deve olhar para a diretiva MaxRequestsPerChild .

Se, por exemplo, você estiver executando aplicativos php, ruby ou perl, que (como a maioria) não são especialmente cuidadosos com vazamentos de memória, provavelmente você deve derrubar MaxRequestsPerChild em cerca de 40 ou mais. O que é um bom valor varia um pouco embora. Algumas pilhas de aplicativos têm muito mais custos associados à reinicialização de processos do que outras, e algumas têm muito mais problemas de vazamento de memória do que outras. Eu defini o MaxRequestsPerChild entre 5 e 1000 em diferentes circunstâncias, mas geralmente é melhor começar de baixo e aumentá-lo em graus enquanto se sente seguro para fazer isso.

Você deve esperar algum aumento no uso da memória após a inicialização em circunstâncias normais, que se estabiliza após algum tempo.

Se você deixou seu servidor desassistido e ficou sem memória, provavelmente ele começaria a usar o swap e ficaria lento demais. Como as solicitações não estão sendo tratadas rapidamente, mais trabalho se acumularia, e isso tenderia a consumir mais memória, a menos que limites em números de processos impeçam isso. Você quer pensar um pouco sobre os limites nos números de processos e quanta memória você acha que seu servidor começaria a usar em tais circunstâncias.

Você também não quer trocar muito. Se você tiver muita troca, seu servidor ficará mais ou menos totalmente sem resposta enquanto consome lentamente sua memória swap. Ou você intervirá com uma reinicialização (é improvável que um shell funcione), ou usará toda a sua troca eo invasor da OOM começará a matar processos. Se chegar a esse ponto, você realmente preferiria o OOM Killer mais cedo. O excesso de troca apenas faz com que o tempo de inatividade seja maior. A recomendação comum de ter o dobro de troca que a RAM é completamente inadequada para a maioria dos servidores da Web.

Aumente seus minspareservers e maxspareservers. Eu colocaria o máximo até 15 ou mais. Qual é o sentido de matá-los abaixo disso? min deve ser de pelo menos 5.

    
por 05.06.2013 / 17:55
1

Você pode ter um vazamento de memória - se os funcionários continuarem crescendo toda vez que você executar o teste ab , provavelmente terá vazamento de memória. (Um pouco de uso da memória além do que você tem quando inicia o servidor é normal. Crescimento previsível contínuo não é).

Se o seu problema é um vazamento de memória, provavelmente é NÃO a falha do servidor web, mas seu código (PHP ou qualquer outra linguagem de script usar, ou alguma biblioteca que você confia que está mal escrito).

A maneira de corrigir um vazamento de memória é analisar o seu código ( como fazer isso seria uma questão de estouro de pilha ), encontrar o vazamento de memória e conserte (ou faça com que a pessoa responsável pelo código gotejante conserte isso).

Se o código é opaco (ou você simplesmente não tem tempo) a resposta do mc0e fornece uma solução viável : Certifique-se de estar usando um MPM apropriado (no Unix isso significa prefork ou worker ) e defina o MaxRequestsPerChild para um valor baixo o suficiente para que seus funcionários sejam reciclados antes de ficar sem RAM.
Esta diretiva tem implicações de desempenho que estão detalhadas na documentação

    
por 05.06.2013 / 22:02
0

Por fim, descobri qual era o problema. Eu não tinha nenhum vazamento no meu código ou qualquer configuração incorreta. O sistema estava se comportando conforme o planejado. No entanto, o problema estava relacionado ao firewall do aplicativo Web, que está atualizando com muita frequência e, sempre que o faz, armazena em cache as regras várias vezes e usa muita memória httpd.

Obrigado a todos

    
por 10.06.2013 / 01:14