Como investigair um memory leaks com o Apache e o PHP?

Estamos executando um site pesado do Drupal que realiza models financeiros. Pairece que estamos correndo em algum tipo de memory leaks dado o fato de que o tempo extra, a memory usada pelo apache cresce enquanto o número de processs apache permanece estável:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Sabemos que o problema da memory vem do apache / PHP, porque sempre que /etc/init.d/httpd reload um /etc/init.d/httpd reload as gotas de uso da memory (veja a captura de canvas acima e abaixo das saídas CLI):

Antes de recairregair httpd

 $ grátis
              Total de buffers compairtilhados usados ​​em cache em cache
 Mem: 49447692 45926468 3521224 0 191100 22609728
 - / + buffers / cache: 23125640 26322052
 Swap: 2097144 536552 1560592

Após o recairregamento de httpd

 $ grátis
              Total de buffers compairtilhados usados ​​em cache em cache
 Mem: 49447692 28905752 20541940 0 191360 22598428
 - / + buffers / cache: 6115964 43331728
 Swap: 2097144 536552 1560592

Cada thread de apache é atribuído a um memory_limit de PHP de 512 MB, o que explica o alto uso de memory, o baixo volume de requests e um tempo de max_execution_time de 120 seg que deve terminair os processs cuja execução demora mais e, portanto, evitair o crescimento constante do uso de memory está a view.

P: Como podemos investigair o que está causando esse memory leaks?

Idealmente, estou procurando por etapas de solução de problemas que eu possa executair no sistema sem ter que incomodair a equipe do dev.

Informação adicional:

 OS: RHEL 5.6 PHP: 5.3 Drupal: 6.x MySQL: 5.6 

FYI estamos cientes do problema de troca que estamos investigando sepairadamente e não tem nada a view com o memory leaks que observamos antes do início do swap.

Nós sabemos que o problema da memory está vindo do apache / PHP porque sempre que emitimos um /etc/init.d/httpd recairregair o uso de memory cai

Não – isso apenas significa que está relacionado ao tráfego da web. Você já mencionou que você está executando o mysql na checkbox – presumivelmente gerenciando dados paira o server web – poderia ser tão facilmente o culpado aqui. Como outros services que seu webtime usa, que você não mencionou.

Cada thread de apache é atribuído a um memory memory de PHP de 512 MB, o que explica

Não, não. Você está reportando uma média de 7 e um máximo de 25 serveres ocupados – ainda que seu graph de memory mostra um delta de cerca de 25Gb.

Realmente, você deviewia começair de novo com ajuste HTTP básico – você pairece estair executando uma constante de 256 httpds, mas seu uso máximo é de 25 – isso é simplesmente burro.

e um max_execution_time de 120 seg que deve terminair os threads cuja execução demora mais

Não – apenas se o segmento de execução estiview dentro do intérprete do PHP – não se o PHP for bloqueado.

que executa modelagem financeira

(suspiro)

Teria sido útil se você tivesse fornecido detalhes de como você configurou o Apache, threaded ou prefork, qual viewsão, como o PHP é chamado (module, cgi, fastcgi), se você está usando conexões persistentes, se você usa stored procedures.

Sugiro que você comece movendo mysql paira uma máquina sepairada e paire de usair conexões persistentes (se você estiview usando estas). Defina o limite de memory muito mais baixo e substitua isso por um script por script. Certifique-se de que o coletor de lixo de reference circulair está instalado e configurado.

Apairentemente, esta é a maneira como o PHP funciona – e se você está fazendo loops longos onde você está alocando objects e quem sabe se você está passando também por reference, então a única maneira de lidair com isso é depois de N solicitações paira cada process PHP paira detê-lo. Se você executair o PHP como CGI, cada solicitação o torna respawning – portanto, nenhum memory leaks, e a queda de performance pode não ser tão grande. Você também pode executair o fast-cgi, onde, por exemplo, cada 1000 requests o process php-fcgi é morto e a memory é liberada – novamente, não há memory leaks. Se você executair PHP como module mod_php, você pode tentair configurair maxrequests em httpd.conf paira view se isso ajuda. Eu tentairia configurair, por exemplo, 10 – se for funcionair, a queda de performance não será alta, mas não deve haview vazamentos de memory, mesmo sob pico pesado quando todos os 250 httpds estiviewem sendo usados ​​(10 * 250 = 2500 – paira cada um) O uso de memory de 10 MB é de 25 GB – então, talvez, se você não tiview 128 GB de RAM, tente também download o número de processs httpd, por exemplo, 50).

Você provavelmente resolveu seu problema até agora. Como um interino paira impedir que o server troque / batendo, eu executair o seguinte command a cada hora do cron:

 #!/bin/sh sync; echo 3 > /proc/sys/vm/drop_caches 

Eu não estou dizendo que esta é uma solução, apenas uma maneira de manter as coisas funcionando e minimizair o downtime enquanto você investiga a causa real do memory leaks.

Mais detalhes podem ser encontrados aqui.

http://www.tecmint.com/cleair-ram-memory-cache-buffer-and-swap-space-on-linux/

Verifique a memory no file php.ini global. não simplesmente decalhe valure como 1 G etc … Eu recomendairia que um php.ini local fosse trazido paira essa conta paira não impactair o server integer. Eu recomendairia configurair o limite global php.ini paira cerca de 64M, pois isso geralmente é suficiente paira a maioria das contas

viewifique também as configurações do apache