fragen stichworte

Apache mit Prefork-Modell mit 1000 MB Speicher pro Prozess

Ich arbeite zurzeit an einer Site, die Apache verwendet, der auf dem Prefork-Speichermodell ausgeführt wird. Das Folgende ist die Konfiguration von httpd.conf

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

Das Folgende ist eine Beispielzeile von oben

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              

Im Folgenden sind die geladenen Apache-Module

aufgeführt
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

Ich bin nicht sicher, ob alle diese Module verwendet werden.

Im Folgenden sind die geladenen PHP-Erweiterungen

aufgeführt
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

Warum verbraucht der Apache so viel Speicher pro Prozess? Ist ti wegen dieser Module? Wenn ja, gibt es Memoryhogs, die ich anfangen kann, um zu sehen, ob sie benutzt werden? Oder könnte es an den PHP-Erweiterungen liegen? Irgendwelche Gedächtnishunde dort?

Die PHP-Speichergrenze ist auf 256 MB festgelegt.

Eaccelerator ist mit 512 MB Speicher konfiguriert.

Der Server ist nicht in der Lage, auch nur geringfügig überdurchschnittliche Lasten zu bewältigen, sobald die Auslastung beginnt, sobald der Verkehr zunimmt, und das System nicht mehr reagiert. Der Server verfügt über insgesamt 8 GB RAM und ist ein dedizierter Quad-Core-Server.

Vielen Dank im Voraus für die Hilfe bei der Lösung dieses Problems.

antworten

Zunächst zur Ermittlung der Speicherbelegung. Das VSS/VSIZE/VIRT ist nicht die tatsächliche Verwendung des Arbeitsspeichers durch den Prozess (wie auch @psusi bemerkt). Es gibt einige Tools, die den tatsächlichen Verbrauch berechnen können, eines ist ein sehr hilfreiches Tool von Peter Willis von Yahoo !:

http://psydev.syw4e.info/new/misc/meminfo.pl

Zwei wichtige Hinweise zu Ihrer Konfiguration. Es ist normalerweise keine gute Idee,

zu verwenden
MaxRequestsPerChild     0

Es sei denn, Sie haben die Anwendung selbst geschrieben. Es ist ziemlich üblich, Speicherverluste zu haben, so dass nach einigen hundert (oder tausenden) Anfragen die Speicherverwendung des Kindes zunimmt und schließlich ein vernünftiges Maß überschreitet. Sie sollten dies wahrscheinlich auf ~ 200 einstellen und sehen, wie viel Speicherplatz sie nach 200 Anfragen benötigen. Dies muss mit der Zeit abgewogen werden, die der Server benötigt. Wenn es mehrere Sekunden dauert und viele Ressourcen erforderlich sind, um neue Kinder zu verzweigen, möchten Sie den Wert erhöhen (oder sogar verringern, wenn er leicht ist).

Zweitens wird Prefork nicht besonders bevorzugt, wenn Sie nicht unbedingt Thread-unsichere Module verwenden, da mehr Speicher benötigt wird:

http://httpd.apache.org/docs/2.0/misc/perf-tuning.html#compiletime

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.

Zum Schluss möchten Sie wahrscheinlich nicht benötigte Module durchgehen und beseitigen. Soweit ich weiß, gibt es kein benutzerdefiniertes Modul, das dabei helfen kann, und Sie versuchen in der Regel, so viele wie möglich zu entfernen und zu überprüfen, ob das System noch funktioniert. Dies ist im Grunde nur Vermutung und Überprüfung, aber es ist die Zeit wert, die es braucht, um zu tun.

Es gibt auch einen Grund, warum ps sagt, dass jeder Prozess so ist. Es ist nicht jeder Prozess, der so viel Speicher belegt. Nachfolgend finden Sie eine gute Beschreibung von ps und Arbeitsspeicher

http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html