O uso de memória dos processos php-cgi está crescendo constantemente

8

Estou tentando configurar um servidor web em um VPS. Meu problema é que o uso de memória dos processos php-cgi aumenta com o tempo, mesmo que o site não esteja recebendo nenhum tráfego. (está por trás de um firewall por enquanto)

O VPS possui 360 MB de RAM. Estou usando o Debian Lenny 32bit e seus pacotes lighttpd e php5-cgi. Além de algumas mudanças na configuração (listadas abaixo), estou usando a configuração de estoque do Debian.

O site é baseado no Drupal. Usando o módulo devel do Drupal, posso dizer que o uso de memória dos scripts PHP é inferior a 20 KB, em média, e nunca excede 8 MB.

Aqui estão as partes relevantes da saída de ps aux:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 29871  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29873  0.0  7.4  65808 27468 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29874  0.0  3.7  55808 13736 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29875  0.0  4.3  58040 16204 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29876  0.0  4.4  57444 16288 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29877  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29879  0.0  9.6  67140 35684 ?        S    Aug12   0:26 /usr/bin/php-cgi
www-data 29880  0.0  6.6  59172 24492 ?        S    Aug12   0:23 /usr/bin/php-cgi
www-data 29881  0.0  7.1  59784 26388 ?        S    Aug12   0:22 /usr/bin/php-cgi
www-data 29882  0.0  7.4  60880 27440 ?        S    Aug12   0:23 /usr/bin/php-cgi
  • É normal ter php-cgi tão grande?
  • É possível estimar o uso da memória php-cgi com base nas configurações?
  • Alguma dica para reduzir o consumo de memória dos processos php-cgi?

A procura de erros conhecidos de vazamento de memória não resultou em nada relevante. E eu ficaria surpreso se os pacotes / configurações padrão do Debian tivessem um vazamento de memória tão óbvio. Outros usuários no mesmo host não têm esse problema.

O que eu fiz até agora é definido PHP_FCGI_MAX_REQUESTScomo um valor baixo, para que os processos php-cgi sejam reciclados rapidamente. Quando eu uso abpara simular alta carga, isso funciona muito bem. Os processos morrem rapidamente antes de crescerem acima de 10 MB. No entanto, sob carga baixa a média, todos os processos crescem constantemente (devido ao balanceamento de carga) e a maioria deles consome 28 MB + simultaneamente, colocando meu VPS em risco de troca. Observe que, mesmo sem nenhum tipo de tráfego, os processos crescem constantemente.

Posso reduzir o número de processos php-cgi, mas isso parece mais uma solução alternativa do que uma correção. Eu ficaria surpreso se o php-cgi normalmente crescesse assim.

Além disso, a soma do número total de RSS dos processos php-cgi fornece:

$ ps -C php-cgi -o rss= | awk '{s+=$1}END{print s/1024}'
195.738

No entanto, free -mfornece a seguinte saída:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
  • Estou esquecendo de algo? Por que a memória usada (sem buffers) é menor que a memória residente total dos processos php-cgi no host?

Eu tenho as seguintes extensões PHP:

php5-cgi php5-common php5-curl php5-gd php5-mysql php5-xcache

xcache.sizeestá definido para 24 milhões. Costumava ser 32 milhões, mas reduzi-lo não ajudou. xcache.var_sizeestá definido como 0. Os demais plug-ins estão usando a configuração de estoque. As páginas de administração do xcache mostram que o xcache está usando menos de 1 MB.

O PHP memory_limitestá definido para 32 milhões.

Aqui está minha configuração do FastCGI:

fastcgi.server    = ( ".php" =>
  ((
    "bin-path" => "/usr/bin/php-cgi",
    "socket" => "/tmp/php.socket",
    "max-procs" => 2,
    "idle-timeout" => 20,
    "bin-environment" => (
      "PHP_FCGI_CHILDREN" => "4",
      "PHP_FCGI_MAX_REQUESTS" => "1000"
    ),
    "bin-copy-environment" => (
      "PATH", "SHELL", "USER"
    ),  
    "broken-scriptfilename" => "enable" 
  ))
)

Estou usando mais ou menos o estoque lighttpd.confque acompanha o Debian.

Informe-me se houver outros dados que eu possa fornecer.

Qualquer ajuda é apreciada. Estou tentando solucionar isso há dias. Eu fiquei sem idéias.

John
fonte

Respostas:

2

Tente diminuir var_size. Se tivéssemos valor em 64 MB, depois de algumas horas, ele começou a trocar bastante e, após algumas horas, estava completamente inoperante. Tente manter as configurações originais em 32M, talvez isso ajude muito - tivemos o mesmo problema em nosso site de viagens Xcache ainda é um monte de software de bugs :(

Tixik
fonte
1

Definir as solicitações máximas é a ideia certa. Essa é a maneira de impedir que a RAM do sistema seja preenchida quando houver um vazamento de memória.

Uma coisa que sugiro que você tente é mudar para o apache + mod_php. Se isso funcionar sem perda de memória, significa que o seu problema estava relacionado ao CGI. Se ele continuar vazando com mod_php, provavelmente haverá um vazamento de memória no código em algum lugar.

Você disse que está usando o Drupal. Você tem algum tipo de módulo Drupal instalado? Duvido que uma versão estável do Drupal tenha vazamentos de memória no núcleo, portanto é mais provável que ocorram problemas em módulos e outros complementos e personalizações de terceiros.

Apreche
fonte
Obrigado pela sua resposta. Todos os módulos do Drupal são bem conhecidos e o módulo devel não relata vazamentos de memória no Drupal. Além disso, o vazamento de memória ocorre mesmo se não houver acertos. Quanto a experimentar o Apache, deixaria isso como último recurso quando estou sem ideias. Obrigado novamente.
John
Estou tendo os mesmos problemas ... Como você mata o processo PHP-CGI quando acaba com ele? Estou apenas usando a mesma configuração com o Wordpress, e está quase matando minha fatia de 256mib.
Kyle
Use o Nginx, pois é menor que os dois servidores e não possui vazamentos de memória do PHP. Wordpress e outros sites grandes usam.
Xeoncross
0

Muitas vezes, esses tipos de problemas ocorrem devido a algum cache de código operacional, como o XCache ou a extensão PHP com cache de memórias.

Janne Pikkarainen
fonte
0

Remova as bibliotecas não utilizadas do /etc/php5/apache2/conf.d. Provavelmente você não precisa de pdo.ini e pdo_mysq.ini ou mysqli.ini Isso economizará alguns Mega de RAM

mazgalici
fonte