Configuration de processus apache au poil … » Le Blog du grand loup Zeur

Configuration de processus apache au poil …

5 février 2011 par Gaëtan Laisser une réponse »

salut à tous …

Aujourd’hui on va parler configuration de processus apache … J’ai eu l’occasion en 3-4 jours de connaitre des problèmes sur plusieurs serveurs différents liée à une surconsommation de mémoire due à apache et à sa gestion des processus faisant littéralement planter mon blog (ça swap mal un RPS! donc 2 crash de la machine en 24 heures … avec les nouveaux prix des serveurs dédiés de chez online.net … je risque probablement de migrer prochainement 😉 ).

Néanmoins ce genre d’incident n’empêche pas de revoir sa configuration, d’autant plus que comme pas mal d’administrateur débutant, l’installation d’un serveur web consiste en un simple apt-get install apache2 (en prenant le temps quand même d’installer modsecurity et les dernières règles depuis le site officiel) et pis c’est tout.

On se retrouve donc avec une configuration qui plafonne à 150 clients max en simultanés, sachant que mon blog n’a que 200 visites par jours, cette configuration est vraiment surestimée.

1.L’estimation du nombre de visiteurs/connexions

La première chose à savoir c’est bien entendu, le nombre de visite, mais aussi le nombre de fichiers auxquels les personnes auront accès lors de leurs première visite, car lors d’une visite, on télécharge la page html, mais aussi toutes ses ressources liées (css, js, images, …), pour un site moyen, il y a entre 20 et 50 connexions quasi simultanée (avec entre 1 et 10 secondes d’écart, suivant son type de connexion).

Pour mon site, j’utilise un CDN, hébergé par google (GAE), qui stock toutes mes données statiques (js,css,images), résuisant de façon assez significative le nombre de connexion sur mon serveur, comme le prouve le pannel de ressource de chrome :

Il n’y a donc qu’une seule requête effectuée sur mon serveur lors de la connexion d’un visiteur, le reste étant directement lié au domaine cdn.gaetan-grigis.eu (hébergé sur appengine et donc ne consommant pas de ressource pour mon serveur web).

Sachant qu’en plus de n’avoir que 200 visiteurs par jours, je n’ai donc que 200 connexions http à gérer (gràce au CDN, ce qui n’est pas le cas de tout les serveurs …).

En partant de ces chiffres, je peux désormais passer à l’étape suivante :

2.Découverte de la cible

Apache ayant plusieurs type de fonctionnement, suivant qu’il soit en prefork ou en worker, nous devons donc savoir à quoi nous avons à faire pour ensuite le configurer :

sudo aptitude search apache2|grep « ^i »

qui renvoit le type de serveur installé, ici un mpm prefork (surligné en jaune) :

Je peux donc passer à la suite :

3.Détection de la menace

On peut passer à la configuration!! Comme je suis en mpm_prefork, j’ai juste à trouver les lignes correspondantes, qui par défaut contiennent ceci :

<IfModule mpm_prefork_module>

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 150

MaxRequestsPerChild 0

</IfModule>

Ce qui signifie :

* StartServers : nombre de serveur démarré par défaut

* MinSpareServers : nombre de serveur de « rechange » EN PLUS du nombre de StartServers (donc par défaut 10 processus au démarrage!!!).

* MaxSpareServers : nombre maximal de serveur de « rechange », si ces serveurs ne sont pas utilisés, leurs processus sont tués!! BOUCHERIE!!! (façon Flander’s Company 😉 )

* MaxClients : Nombre de clients simultanées … en prefork, il s’agit du nombre de process max qui peuvent être crée. Son nombre multiplié à la taille moyenne d’un processus apache ne doit pas dépasser la taille de la ram dispo (sinon le kernel devra lutter pour libérer ce qu’il peux).

* MaxRequestsPerChild : nombre de requête qu’un processus va faire avant de mourir (0 = infinie), si vos applications web (phpmyadmin, wp, …) bouffe beaucoup de mémoire, cette mémoire sera consommée jusqu’à ce que le processus soit tué, donc plus vous avez d’application gourmande et plus ce chiffre est élevé, plus apache va consommé de mémoire (et si en plus ce chiffre est 0, la mémoire ne sera jamais libéré!!).

Il y a donc de l’optimisation à faire !!

4.Les calculs pour l’éradication de la menace

Mes petits calculs pour optimiser la bête et ne plus utiliser le swap lorsqu’apache déconne : Un RPS chez OVH (probablement un SC chez online.net d’ici peut).

J’ai donc 512Mo de ram (493636 ko pour être exact 😉 ) à partager entre plusieurs services : MYSQL et Apache principalement.

En faisant quelque test, avec unMaxRequestsPerChild à 3, un process apache en fin de vie utilisera 50Mo (avec en application principal WordPress).

Avec ma machine et les contraintes de services j’ai donc : 120Mo (Mysql) + 100Mo (Système : IPS, …) + 100Mo (libre pour des bursts ou autre) = 320Mo, il me reste donc 200Mo de libre pour apache (200Mo/50Mo) = 4 processus.

Donc par défaut, ma machine pourra avoir 3/4 processus apache qui tourne en continue avec plusieurs processus apache en burst. Sachant qu’en plus le kernel est censé un peu gérer la mémoire lorsque ça devient serré, ça devrait pouvoir tenir mon nombre de visiteurs, sans avoir à exploser ma mémoire inutilement … au pire, les visiteurs patienteront 😉

Note : Mon calcul est très sévère, mon serveur peut faire tourner facilement une dizaine de processus apache sans trop de soucie, mais lors de pic de fréquentation élevé, il va commencer à swaper et devenir très lent (sur les RPS le disque dur est en réseau à 1Mo/s ..). Mais, avec cette configuration, je peux servir 3/4 clients par seconde, ce qui est amplement suffisant au vue de mes besoins.

5.Mise en place de la configuration

J’ai donc remplacé mon ancienne configuration par celle-ci, qui correspond à mes besoins actuelle.

<IfModule mpm_prefork_module>

StartServers 2 #démarrage de 2 processus

MinSpareServers 1 #1 processus de rechange par défaut donc 3 processus au démarrage

MaxSpareServers 3 #3 processus de rechange max, le reste étant tué lorsqu’il rentre en inactivité

MaxClients 12 #12 process max (12 processus*40Mo = 480Mo Max pour apache en cas de gros coup dur), 40Mo étant la taille moyenne d’un processus apache.

MaxRequestsPerChild 3 #une fois que le process à fait 3 réponse, il se tue et un autre est crée, histoire de renouveler la mémoire

</IfModule>

Et on oublie pas de redémarrer 😉 . Après plusieurs heures de fonctionnement, mon RPS a toujours 100Mo de libre (à part lorsque le nombre de visiteur augmente de façon importante), ce qui était plus ou moins le but de cette configuration.

6.Note

Si votre machine fait uniquement tourner un serveur apache (sur une machine stable), il n’y a pas besoin d’être aussi strict que je l’ai été (il n’y a pas de mal à swapper 😉 ), mais visiblement chez OVH, dès qu’une machine swap (et pas seulement sur les RPS apparement), elle ne répond plus très bien et si apache est mal configuré, il faudra généralement redémarrer apache pour le forcer à libérer toute la mémoire qu’il vampirise, ce qui peut poser problème pour des serveurs de jeux ou autre …

Pour mes calculs je me suis basé sur la valeur moyenne de la mémoire consommée par MES processus apaches (cette taille peut dépendre des modules utilisés et de leurs configurations : mod_php, mod_security, …). Cette taille peut donc changer, suivant votre configuration.

viaConfiguration de processus apache au poil … » Le Blog du grand loup Zeur.