3 votes

Apache 2.2 utilise éventuellement toute la mémoire (worker mpm)

Je suis en train de mettre au point un serveur Apache 2.2 (partagé avec MySQL + Courier + Mongo + Postgre). Le serveur est bare metal (pas de virtualisation) avec 2 Xeon quad-core (total 16 core) et 12GB ECC RAM (upgrade à 24GB dans les prochains jours). MySql a un innodb_buffer réglé sur 2G et se porte bien. Mongo et Postgre sont à peine touchés - juste pour le développement.

Le problème est qu'Apache consomme toute la mémoire disponible, finissant par utiliser tout le swap (et donc par faire planter MySql car il utilise plus de mémoire). Nous avons Apache 2.2 avec worker MPM et mod_security. Chaque fois que nous le redémarrons, nous avons environ 8G de RAM libre.

J'essaie de comprendre certaines choses :

  • Quelle est la relation entre les processus montrés dans top avec les serveurs de travail ? Je m'attendais à voir au maximum 10 processus (comme la ServerLimit dans les paramètres du travailleur - sans prendre en compte le processus principal).
  • La quantité de mémoire RES est-elle utilisée pour chaque THREAD ou pour chaque PROCESSUS ?
  • Dans la sortie mod_status ci-dessous, il y a beaucoup de requêtes READING qui restent là pendant un long moment. J'ai essayé d'activer ExtendedStatus pour découvrir quels clients sont présents, mais je n'ai pas trouvé d'informations utiles - des suggestions ?
  • avec l'utilisation réelle de la mémoire, de quelle quantité de RAM aurais-je besoin pour servir 400 connexions simultanées ? (le statut du mod indique que 250 est déjà épuisé).
  • Pourquoi ne pas augmenter ThreadsPerChild au lieu d'augmenter MaxClients/ServerLimit ?

    <IfModule worker.c> StartServers 2 MaxClients 250 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 ServerLimit 10 </IfModule>

TOP montre (seulement pour apache) :

top - 16:30:21 up 46 days, 23:12,  2 users,  load average: 0.94, 0.97, 1.31
Tasks: 460 total,   1 running, 459 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.8%us,  0.5%sy,  0.0%ni, 96.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12187448k total, 10686748k used,  1500700k free,    67104k buffers
Swap:  1048568k total,   275904k used,   772664k free,  2371208k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24252 wwwrun    20   0 2216m 161m 7484 S 20.2  1.4   0:09.25 httpd
24750 wwwrun    20   0 1264m  51m 6196 S  9.9  0.4   0:00.93 httpd
23996 wwwrun    20   0 2136m 279m 7292 S  6.0  2.4   0:16.76 httpd
23326 wwwrun    20   0 2216m 276m 7376 S  2.7  2.3   0:16.81 httpd
23582 wwwrun    20   0 2208m 293m 7132 S  2.3  2.5   0:27.30 httpd
23688 wwwrun    20   0 1904m 208m 7304 S  1.0  1.8   0:13.62 httpd
19507 wwwrun    20   0 2182m 229m 8096 S  0.7  1.9   0:18.65 httpd
23616 wwwrun    20   0 1908m 239m 7092 S  0.7  2.0   0:18.48 httpd
18304 wwwrun    20   0 2160m 334m  11m S  0.3  2.8   0:47.38 httpd
23637 wwwrun    20   0 1830m 231m 7556 S  0.3  1.9   0:20.56 httpd
24457 wwwrun    20   0 2196m 174m 6568 S  0.3  1.5   0:04.11 httpd
15694 wwwrun    20   0 2199m 295m 7504 S  0.0  2.5   0:20.54 httpd
15783 wwwrun    20   0 2172m 244m  10m S  0.0  2.1   0:17.45 httpd
16577 wwwrun    20   0 2128m 354m 7436 S  0.0  3.0   0:28.21 httpd
18290 wwwrun    20   0  277m 9880  964 S  0.0  0.1   0:00.05 httpd
18379 wwwrun    20   0 2208m 211m 6864 S  0.0  1.8   0:08.57 httpd
18480 wwwrun    20   0 2096m 305m 7540 S  0.0  2.6   0:17.72 httpd
18791 wwwrun    20   0 1920m 251m 7244 S  0.0  2.1   0:20.24 httpd
19348 wwwrun    20   0 2060m 310m 7388 S  0.0  2.6   0:22.07 httpd
19619 wwwrun    20   0 2206m 235m 7340 S  0.0  2.0   0:15.30 httpd
19999 wwwrun    20   0 2178m 144m 7132 S  0.0  1.2   0:05.50 httpd
20697 wwwrun    20   0 2002m 193m 7276 S  0.0  1.6   0:08.12 httpd
20838 wwwrun    20   0 1890m 127m 7260 S  0.0  1.1   0:07.44 httpd
21407 wwwrun    20   0 1988m 290m 7708 S  0.0  2.4   0:39.33 httpd
22252 wwwrun    20   0 2216m 295m 7732 S  0.0  2.5   0:27.04 httpd
22723 wwwrun    20   0 2020m 187m 7444 S  0.0  1.6   0:39.80 httpd
22753 wwwrun    20   0 1850m 206m 7448 S  0.0  1.7   0:10.62 httpd
23174 wwwrun    20   0 1990m 229m 7332 S  0.0  1.9   0:07.71 httpd
23383 wwwrun    20   0 1504m  76m 6372 S  0.0  0.6   0:01.25 httpd
23720 wwwrun    20   0 1906m 225m 7080 S  0.0  1.9   0:20.12 httpd
24778 wwwrun    20   0  970m  30m 5604 S  0.0  0.3   0:00.80 httpd

Enfin, la sortie mod_status :

   Server Version: Apache/2.2.23 (Unix) mod\_ssl/2.2.23 OpenSSL/1.0.0-fips Domain Server PHP/5.3.24 with Suhosin-Patch mod\_perl/2.0.5
          Perl/v5.10.1

   Server Built: May 15 2013 10:17:30
     \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

   Current Time: Monday, 12-May-2014 16:41:08 BRT
   Restart Time: Monday, 12-May-2014 15:36:37 BRT
   Parent Server Generation: 1
   Server uptime: 1 hour 4 minutes 31 seconds
   Total accesses: 36446 - Total Traffic: 1.6 GB
   CPU Usage: u213.3 s13.65 cu0 cs0 - 5.86% CPU load
   9.42 requests/sec - 442.8 kB/second - 47.0 kB/request
   249 requests currently being processed, 0 idle workers

WWRRKRKRRKRRRRWRRWWWRWCRR.......................................
RWWWRRWRRRRKKRKRWRRRRRWWR.......................................
WRWRCRRWRRWWRKRRWWRRWRWWW.......................................
WRWKKWWWRWKRRWRCRRRWWRWWW.......................................
WRWRWCRKCWWWRWWRRWWCRWRWW.......................................
WRWKRWRRKKRKRRRRCWWKWWWRW.......................................
RWWKWRRWKRRRWRRWWCRRRRRRW.......................................
WWWRRWRKWWWKRWWWWRWWWKRRW.......................................
RRRRRRRK.WKRRWRWWKRRWRRKR.......................................
KCRRRRWRWWKRWWWRRKWRWRWRK.......................................

アップデート1:

J'ai essayé de désactiver mod_security2, j'ai modifié les paramètres des travailleurs, mais Apache finissait par consommer près de 20 Go de RAM (j'ai ajouté un fichier d'échange de 13 Go pour éviter le plantage du serveur).

Finalement, j'ai désactivé KeepAlive, et maintenu MaxRequestsPerChild à 100 - maintenant Apache utilise 2-3G, et les demandes sont nettoyées, comme le montre la sortie d'état ci-dessous :

   Current Time: Tuesday, 13-May-2014 17:07:48 BRT
   Restart Time: Tuesday, 13-May-2014 16:49:14 BRT
   Parent Server Generation: 0
   Server uptime: 18 minutes 33 seconds
   Total accesses: 6637 - Total Traffic: 133.2 MB
   CPU Usage: u34.43 s3.05 cu0 cs0 - 3.37% CPU load
   5.96 requests/sec - 122.5 kB/second - 20.5 kB/request
   14 requests currently being processed, 86 idle workers

..................R.............................................
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_RR\_\_R\_R\_\_RC\_RWC\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_..............
R\_WC\_\_R\_\_\_R\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_..............
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

2voto

Nathan C Points 14821

KeepaliveTimeout permettrait de réduire le nombre de travailleurs suspendus "lus".

MPM utilise plusieurs processus avec plusieurs threads pour gérer le trafic entrant, donc ce que vous voyez est un fonctionnement normal d'Apache.

Ce réglage par défaut peut mieux convenir à vos besoins :

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

Cela entraînerait la création de 10 processus au total ( MaxClients / ThreadsPerChild ), ce qui réduirait considérablement l'empreinte mémoire de votre serveur. Vous pouvez vous permettre d'utiliser plus de threads sur moins de processus en raison de la disponibilité des CPU.

Notez que la modification de ces variables nécessite l'arrêt complet puis le redémarrage d'Apache.

0 votes

Merci, je vais essayer votre suggestion et jeter un coup d'œil à KeepaliveTimeout aussi. Je veux toujours connaître la relation entre les "serveurs" apache (ServerLimit) et les processus affichés dans le tableau suivant top -- Je veux dire, il y avait plus de 20 processus apache dans top mais il était configuré pour créer 10 serveurs maximum.

0 votes

Je vois que vous utilisez mod_perl qui peuvent être responsables. La page d'état montre 10 processus, donc tous les autres sont probablement des parties différentes d'Apache et ne traitent pas les demandes directement.

2voto

Jeremy Harnois Points 21

Quelle est la relation entre les processus affichés en haut et les serveurs ouvriers ? Je m'attendais à voir au maximum 10 processus (comme la ServerLimit dans les paramètres du travailleur - sans prendre en compte le processus principal).

Ça ne ressemble pas à la top d'un serveur Apache exécutant le MPM travailleur. Je fais tourner deux serveurs, un avec le MPM worker et un autre avec le MPM prefork. Avec worker, le top liste les processus Apache comme httpd.worker et le nombre de processus correspond au nombre de serveurs actifs (lignes de points avec quelques entrées sans points) visibles via mod_status. Avec prefork, les processus sont listés comme httpd et ce nombre correspond à peu près au nombre de travailleurs inactifs (chaque entrée sans point).

Donc, étant donné cette sortie mod_status :

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

top sur un serveur exécutant prefork devrait montrer environ 31 httpd les processus, et top sur un serveur exécutant worker devrait montrer 3 httpd.worker processus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X