uso de memória httpd

13

Tendo alguns problemas com o uso de memória httpd( Apache/2.2.29).

Com o tempo, o uso da memória nos httpdprocessos aumenta até chegar a 100%.

A última vez que reiniciei httpdfoi cerca de 24 horas atrás. A saída de free -mé:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Para provar que é definitivamente httpd, reiniciei httpde corri free -mnovamente:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Portanto, reiniciar o Apache leva a memória livre de 239 Mb para 894 Mb - o que parece um grande salto.

Venho examinando a lista de módulos Apache atualmente ativados (há bastante) e desativado / removido mod_wsgie mod_perl(nenhum dos quais é necessário para este servidor, que está executando um aplicativo Web baseado em PHP - Magento, especificamente).

Com base em https://servercheck.in/blog/3-small-tweaks-make-apache-fly , executei ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'e obtive a seguinte saída:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

A execução da outra ferramenta de diagnóstico sugerida para a MaxClientsqual ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'retorna o seguinte:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Este servidor ( m1.smallinstância do Amazon AWS ) possui 1.7 GbRAM. Então, portanto:

Mais sugestões / sugestões sobre a melhor forma de ajustar as httpdconfigurações ou como diagnosticar o que exatamente pode estar causando isso?

James Spittal
fonte
Observe que, para verificar o uso da memória pelos processos, é necessário observar a -/+ buffers/cachelinha; no entanto, neste caso, a alteração é comparável. Dependendo de como o apache foi ajustado, ele pode começar com apenas alguns processos prontos para lidar com solicitações; após um período de muitas solicitações simultâneas, provavelmente haverá mais processos bifurcados para lidar com a carga. O número de processos inativos também pode ser ajustado. Portanto, se o apache crescer para usar muita memória, você precisará fazer alguns ajustes.
Wurtel
Eu estou bem na configuração do servidor Apache, mas não fiz uma quantidade enorme em termos de ajuste de desempenho no Apache no passado. Alguma sugestão sobre quais diretivas eu deveria estar olhando ou guias? Existe uma configuração que eu posso habilitar para dizer ao Apache para eliminar processos bifurcados após um certo período de tempo? (Parece que o Apache não faz isso por padrão, por alguma razão.)
James Spittal
Esta é a razão exata pela qual me afastei do Apache ... tente o Nginx ou até o Lighttpd.
Interessante. Ouvimos coisas boas, nginxentão talvez seja a hora de tentarmos, mas honestamente, eu uso o Apache há anos e nunca tive grandes problemas. Magento realmente mastiga memória embora.
James Spittal
Observe que seu script para calcular o uso médio da memória inclui o baixo uso de memória do processo- grep httpd(pelo menos para mim). Para corrigir isso, eu recomendaria excluir essa linha do cálculo da seguinte maneira:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR 04/04/19

Respostas:

11

Aqui está o que eu fiz para 'resolvê-lo':

  1. Conjunto MaxClients 7(com base em (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Portanto:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Desativar todos os módulos do Apache, exceto authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Remova o mod_sslpacote, pois o cliente não está usando nenhum https://.

Vou relatar assim que essa nova configuração estiver em execução há algum tempo para ver se isso a resolve.

Alguma inspiração aqui foi emprestada de: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ e http://www.activoinc.com/ downloads / httpd.conf-magento

James Spittal
fonte
A configuração acima definitivamente ajudou em massa.
James Spittal
1
Alguns dias depois, os problemas de "vazamento de memória" httpdparecem ter desaparecido completamente.
James Spittal
2

Receio que a opção MaxRequestsPerChild tenha ajudado no seu caso, pois permite a reciclagem do processo após um número definido de solicitações, para que haja vazamento de memória, mas não seja mais visível.

Além disso: MaxClients = ServerLimit * ThreadsPerChild

No seu caso, se você precisar de apenas 7 usuários simultâneos (MaxClients = 7), é o suficiente com 2 processos (apenas no caso de um falhar em minimizar o tempo de inatividade), portanto, a configuração pode ser:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Eu uso o MaxClients 8 , apenas para fazer uma distribuição de solicitação mais igual entre dois processos.

Igor Levkov
fonte