Liberação automática da memória PHP após determinado tempo

3

Temos um servidor web executando um aplicativo PHP para atender aos clientes.

  • PHP 4
  • 3 GB de memória
  • Centos
  • servidor HTTP Apache.

Conforme nossa carga de clientes aumentou, estamos tendo problemas de memória do servidor. Mais cedo ou mais tarde, precisamos reiniciar o serviço HTTP para liberar a memória (provavelmente 5 vezes por dia).

Podemos dizer pelo início que a maioria dos processos HTTP são bons, usando apenas um pouco de memória , mas existem cerca de 3-4 processos HTTP que estão ocupando 80% da memória e quase zero de uso da CPU. Parece processos mortos, mas eles não liberam memória até que reinicie o serviço HTTP.

Suspeitamos que alguma parte do nosso código PHP não está funcionando bem e causando um enorme uso de memória, depois pendurado lá. Existe uma configuração do PHP em algum lugar que podemos definir que irá encerrar o processo e liberar a memória depois de, digamos, 5 minutos ociosos? Esta é uma solução de curto prazo, mas teremos que descobrir o código que está fazendo isso - difícil de encontrar.

    
por starchx 13.04.2011 / 09:20

3 respostas

2

Existem algumas linhas no seu arquivo php.ini que são relevantes. Um é o memory_limit que define quanta memória RAM um dado script php tem permissão para comer, o outro é max_execution_time que define quanto tempo de CPU ele recebe antes de ser eliminado. Esteja ciente de que este último momento é baseado no tempo da CPU e não na hora do relógio, portanto, se ele não estiver usando nenhuma CPU, talvez não some.

Além disso, como você observou, esses são hacks temporários para atenuar um aplicativo mal-comportado, e não uma correção real. Você pode achar o strace útil para descobrir exatamente o que os processos que consomem memória estão fazendo.

    
por 13.04.2011 / 09:41
3

O Apache tem uma diretiva MaxRequestsPerChild que pode ser instruída a reciclar trabalhadores (os processos que incorporam mod_php) após um certo número de pedidos terem sido processados.

    
por 13.04.2011 / 13:34
2

No Linux, a memória "cache" é a memória livre usada para armazenar arquivos em cache. O Linux usa o máximo de memória possível para acelerar o io com dispositivos de bloco. Se os programas precisarem de memória real, o linux liberará as páginas de cache antes de trocar.

Por exemplo, agora no meu laptop, tenho 90% de memória usada, mas 0% de troca. Isso ocorre porque a memória real usada é de apenas 20%.

Top informará quanta memória está indo para buffers. Se esse número for grande, isso significa que a memória usada é apenas para o cache, não para a memória usada de verdade. Durante o dia, você pode verificar quanta memória vai trocar (seu verdadeiro problema).

se você usar o comando 'free', você tem uma linha com "- / + buffers / cache", com sua memória usada de verdade.

Você pode ler sobre / proc / sys / vm / swappiness para controlar a quantidade de memória que irá para trocar ou armazenar arquivos em cache.

    
por 13.04.2011 / 11:35