Apache com modelo prefork usando 1.000 MB de memória por processo

2

Atualmente, estou trabalhando em um site que usa o Apache em execução no modelo de memória do prefork. O seguinte é a configuração do httpd.conf

<IfModule prefork.c> 
  StartServers            30
  MinSpareServers         15
  MaxSpareServers         30
  MaxClients              96 
  ServerLimit             512
  MaxRequestsPerChild     0
</IfModule>

O seguinte é uma linha de amostra do topo

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
29261 apache    15   0 1003m 231m  53m S 16.3  2.9   1:47.68 httpd              

A seguir, os módulos do apache carregados

core prefork http_core mod_so mod_auth_basic mod_authn_file 
mod_authz_host mod_authz_user mod_include mod_log_config 
mod_logio mod_env mod_ext_filter mod_mime_magic mod_expires 
mod_deflate mod_headers mod_usertrack mod_setenvif mod_mime 
mod_status mod_autoindex mod_info mod_vhost_alias mod_negotiation 
mod_dir mod_actions mod_alias mod_rewrite mod_cgi mod_version 
mod_realip2 mod_php5 mod_ssl

Não tenho certeza se todos esses módulos são usados.

Seguem-se as extensões php carregadas

date, libxml, openssl, pcre, zlib, bz2, calendar, ctype, 
curl, hash, filter, ftp, gettext, gmp, session, iconv, 
posix, Reflection, standard, shmop, SimpleXML, SPL, sockets, 
exif, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, 
apache2handler, memcache, uploadprogress, dbase, dom, 
eAccelerator, gd, json, mbstring, mcrypt, memcached, mongo, 
mysql, mysqli, newrelic, PDO, pdo_mysql, pdo_sqlite, xmlreader, 
xmlwriter, xsl, zip

Por que o apache estaria usando tanta memória por processo? É ti por causa desses módulos? Se assim for há memoryhogs lá que eu possa começar a olhar para ver se eles estão sendo usados? Ou poderia ser por causa das extensões do php? Qualquer memoryhogs lá?

O limite de memória do php está definido para 256MB.

O Eaccelerator está configurado com 512MB de memória.

O servidor não é capaz de lidar com cargas ligeiramente acima da média, pois o uso da troca é iniciado assim que o tráfego aumenta, deixando o sistema sem resposta. O servidor tem um total de 8GB de RAM e é um servidor quad core dedicado.

Agradecemos antecipadamente por qualquer ajuda na resolução deste problema.

    
por anoopjohn 09.10.2011 / 01:25

2 respostas

3

Primeiro, sobre determinar o uso da memória. O VSS / VSIZE / VIRT não é o uso real da RAM pelo processo (como @psusi também observou). Existem algumas ferramentas que podem calcular o uso real, uma é uma ferramenta muito útil por Peter Willis do Yahoo !:

link

Duas notas importantes sobre sua configuração. Geralmente não é uma boa ideia usar:

MaxRequestsPerChild     0

A menos que você tenha escrito o aplicativo por conta própria. É bastante comum ter vazamentos de memória, portanto, após várias centenas (ou milhares) de solicitações, o uso de memória da criança aumentará e, eventualmente, excederá um nível razoável. Você provavelmente deve definir isso para ~ 200 e ver quanta memória eles usam após 200 solicitações. Isso tem que ser pesado com a quantidade de tempo que a desova do servidor demora. Se levar vários segundos e muitos recursos para forçar novos filhos, você deseja aumentar o valor (ou mesmo diminuí-lo se for leve).

Em segundo lugar, a menos que você esteja usando especificamente o prefixo de módulos não seguros, o preffork não é realmente preferido, já que usa mais memória:

link

The prefork MPM uses multiple child processes with one thread each. Each process handles one connection at a time. On many systems, prefork is comparable in speed to worker, but it uses more memory.

Por último, você provavelmente desejará passar e eliminar os módulos desnecessários. Tanto quanto eu sei, não há módulo personalizado para ajudar a fazer isso e você geralmente acaba tentando remover o maior número possível e verificar se o sistema ainda funciona. Isso é basicamente chute e checagem, mas vale a pena uma ou duas horas de tempo.

    
por 09.10.2011 / 03:37
2

Existe também uma razão pela qual o ps diz que todo processo é assim .. não é todo processo que está usando muita memória .. veja o seguinte para uma boa leitura sobre ps e memória

link

    
por 09.10.2011 / 03:53