J'ai actuellement un serveur Apache2 fonctionnant avec mpm-prefork
et mod_php
sur un OpenVZ VPS avec 512 Mo de RAM réel / 1024 Mo de mémoire vive (pas de swap). Après avoir exécuté quelques tests, j'ai constaté que la taille maximale du processus qu'Apache obtient est de 23 MaxClients
Mo, j'ai donc défini 25 (23 Mo x 25 = 575 Mo, ok pour moi). J'ai décidé d'exécuter des tests de charge sur mon serveur et les résultats m'ont laissé perplexe.
J'utilise ab
sur ma machine de bureau pour demander la page principale d'un blog wordpress.
Lorsque je cours ab
avec 24 connexions simultanées, tout semble aller bien. Bien sûr, le CPU augmente, la RAM libre diminue et le résultat est un temps de réponse d'environ 2-3 secondes par demande.
Mais si je lance ab
avec 25 connexions simultanées (ma limite de serveur), Apache se bloque juste après quelques secondes. Il commence à traiter les demandes, puis il cesse de répondre, le processeur revient à 100% inactif et ab
expire. Le journal Apache indique qu'il a atteint MaxClients
.
Lorsque cela se produit, Apache reste verrouillé avec 25 processus en cours d'exécution (ils sont tous en "W" si je vérifie l'état du serveur) et seulement après le TimeOut
réglage, les processus commencent à mourir et le serveur recommence à répondre (dans mon cas, il est défini à 45).
Ma question: est-ce le comportement attendu? Pourquoi Apache meurt juste quand il atteint MaxClients
? Si cela fonctionne avec 24 connexions, ne devrait-il pas fonctionner avec 25 connexions, en prenant peut-être juste plus de temps pour répondre à chaque demande et mettre en file d'attente le reste?
Cela me semble un peu étrange que tout enfant en cours d'exécution ab
puisse à lui seul tuer un serveur Web simplement en configurant les connexions simultanées aux serveurs MaxClients
.