Réduire l’utilisation mémoire du MPM Worker d’Apache

Selon la documentation d’Apache, le MPM worker nécessite moins de ressources que l’historique pre-fork. Cherchant à économiser les ressources de mon petit Kimsufi, j’ai voulu essayer ce mode :

echo 'www-servers/apache threads' >> /etc/portage/package.use
echo 'APACHE2_MPMS="worker"' >> /etc/make.conf
emerge apache

Cependant, je fus assez déçu du résultat, car avec les paramètres par défaut plus de RAM était consommée qu’avec le MPM prefork (pour un faible trafic).

apache   27556  0.0  0.7  24352 15448 ?        S    00:54   0:00 /usr/sbin/apache2
apache   27557  0.0  0.7  24984 15312 ?        S    00:54   0:00 /usr/sbin/apache2
apache   27558  0.0  0.8 246632 16252 ?        Sl   00:54   0:00 /usr/sbin/apache2
apache   27561  0.0  0.8 246632 16252 ?        Sl   00:54   0:00 /usr/sbin/apache2

La solution : diminuer la taille de la pile

Après quelques recherche, je suis tombé sur ce post, où un utilisateur avait le même problème, et la solution :

Stack size is counted towards virtual memory
Default stack size is very high on Linux (8MB)
Every thread uses separate stack
=> multi threaded application will use at least number_of_threads * 8MB virtual memory!

Par défaut le MPM worker crée 25 threads par processus, utilisant chacun au moins 8 Mo pour la pile ! En réduisant la taille par défaut de la pile, on peut largement diminuer la mémoire consommée par Apache :

web apache2 # ulimit -s
8192
web apache2 # ulimit -s 256
/etc/init.d/apache2 restart

On constate alors que la mémoire virtuelle utilisée par chacun des processus apache a diminuée drastiquement :

apache   28029  0.0  0.7  24352 15444 ?        S    00:56   0:00 /usr/sbin/apache2
apache   28031  0.0  0.7  24984 15460 ?        S    00:56   0:00 /usr/sbin/apache2
apache   28032  0.0  0.8  32660 17340 ?        Sl   00:56   0:00 /usr/sbin/apache2
apache   28035  0.0  0.8  32500 17320 ?        Sl   00:56   0:00 /usr/sbin/apache2

De plus, ceci est valable pour tous les processus multi-threads, comme fail2ban ou mysqld !

Limiter la taille de la pile au boot

L’appel précédent à ulimit n’est valable que dans le shell courant.

Afin d’appliquer automatiquement cette limite pour tous les services sur Gentoo, il faut ajouter la ligne suivante dans le fichier /etc/conf.d/rc :

RC_ULIMIT="-s 256"

Remarques

J’ai ici utilisé la taille recommandée dans le post cité. J’ai tout de même une légère crainte que le passage de 8192 à 256 ne soit un peu excessif. Je verrai à l’usage s’il est nécessaire d’augmenter cette valeur.

Edit : en effet, il ne m’aura fallu que quelques jours pour détecter un problème… Impossible pour portage de télécharger quoi que soit lors d’un emerge. J’ai donc ré-augmenté un peu la taille de la pile en la passant à 512k.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *