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

8

Estou tentando configurar um servidor da 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 tráfego algum. (está por trás de um firewall por enquanto)

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

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

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 o php-cgi tão grande?
  • É possível estimar o uso da memória do php-cgi com base nas configurações?
  • Alguma dica para reduzir o consumo de memória dos processos php-cgi?

A pesquisa de bugs com vazamentos de memória conhecidos não resultou em nada relevante. E eu ficaria surpreso se os pacotes / config 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 foi definir PHP_FCGI_MAX_REQUESTS como um valor baixo para que os processos php-cgi sejam reciclados rapidamente. Quando eu uso ab para simular carga alta, isso funciona muito bem. Os processos morrem rapidamente antes de crescerem mais de 10MB. No entanto, sob carga de 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. Por favor, note que, mesmo sem qualquer tipo de tráfego, os processos crescem de forma constante.

Eu posso reduzir o número de processos php-cgi, mas isso parece mais uma solução 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 -m fornece 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 sentindo falta de algo? Como é que a memória usada (sem buffers) é menor que a memória total residente 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.size está definido como 24M. Costumava ser 32M, mas reduzi-lo não ajudou. xcache.var_size está definido como 0. Os plug-ins restantes 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.

memory_limit do PHP está definido como 32M.

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.conf que vem com o Debian.

Por favor, deixe-me saber se há outros dados que eu possa fornecer.

Qualquer ajuda é apreciada. Eu tenho tentado solucionar isso por dias. Eu fiquei sem ideias.

    
por John 13.08.2009 / 22:11

4 respostas

2

Tente diminuir o tamanho do var_size. Se tivéssemos um valor de 64MB, depois de algumas horas, começamos a trocar muito, e depois das próximas horas ele estava completamente inativo. Tente manter as configurações originais em 32M, talvez isso deva ajudar muito - tivemos o mesmo problema em nosso site viagens O Xcache ainda é muito de software com bugs: (

    
por 10.11.2010 / 13:04
1

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

Uma coisa que eu sugiro que você tente é mudar para o apache + mod_php. Se isso funciona sem vazamento de memória, significa que seu problema está relacionado a CGI. Se continuar vazando com o mod_php, então provavelmente há um vazamento de memória no código em algum lugar.

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

    
por 14.08.2009 / 05:24
0

Muitas vezes, esse tipo de problema se deve a algum cache de código operacional, como o XCache ou a extensão do memcached do PHP.

    
por 10.11.2010 / 13:12
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á poucos Mega de Ram

    
por 10.12.2010 / 12:08