Solution 1 :
Je vous ai donné la réponse à cela dans les commentaires sur le serveur ne répondant pas à SSH et HTTP mais le ping fonctionne, mais apparemment vous ne me croyez pas. Vraiment, c'est vrai !
Vous devez tailler MaxClients
/ ServerLimit
à votre système. Les "5-10 paramètres pour les serveurs Min/Max" que vous mentionnez ne sont fondamentalement pas pertinents - c'est juste le nombre de extra les serveurs qui traînent ne font rien qu'Apache retiendra.
Afin de définir MaxClients de manière appropriée, regardez la ligne haute typique pour votre httpd
(ou apache2
) processus, puis divisez votre mémoire disponible par cela. Le mieux est de descendre un peu pour donner au reste du système de la place pour respirer. Puisque vous avez 4 Go de RAM et 185 Mo de processus, cela signifie que votre ServerLimit
la valeur doit être de 21 au plus — probablement 20 ou 19.
Maintenant, il se peut que 190 Mo soit atypique. Vous pouvez définir le ServerLimit plus haut, en fonction d'une estimation différente de l'utilisation typique, mais vous pariez alors que vous n'aurez jamais de pic. Si cela se produit, votre système manquera de mémoire.
Si vous pouvez trouver un moyen de limiter votre utilisation de la mémoire par travailleur, ce sera une victoire. Je parie que c'est un cas de PHP Ate My RAM. Pouvez-vous coder votre application pour vivre dans un memory_limit
inférieur ? Si vous ne pouvez pas le faire, vous avez besoin d'un modèle différent sous lequel exécuter votre PHP. Si vous ne pouvez pas le faire, vous devez acheter plus de RAM.
Solution 2 :
Le préfork MPM d'Apache gère automatiquement les serveurs. Il commencera toujours par StartServers
démons, et n'exécutera jamais moins de MinSpareServers
une fois que ça démarre. Il finira également par retirer/éliminer les serveurs au-delà de MaxSpareServers
s'ils sont inactifs assez longtemps (je ne me souviens pas de ce qu'est "Assez longtemps" dans ce contexte, ni si/comment cela peut être modifié).
ServerLimit
définit le nombre maximum de démons apache pouvant s'exécuter à un moment donné - C'est pourquoi, dans votre situation, vous pouvez avoir des centaines de processus apache endormis (ils ont été créés pour répondre à un flot de requêtes et n'ont pas été inactifs assez longtemps pour être encore tué par le processus mère).
Personnellement, je pense que 1250 est une valeur assez élevée pour ServerLimit
/MaxClients
-- 250 peut être un nombre plus raisonnable (bien que cela puisse entraîner l'erreur occasionnelle 503/Serveur occupé si vous recevez un flot massif de demandes :si cela devient un problème chronique, vous pouvez augmenter le nombre ou ajouter plus de serveurs pour gérer la charge ).
Reliant cette question à votre précédente Re :un crash de mémoire insuffisante, suivez certainement les conseils du manuel Apache sur ce paramètre :
Most important is that MaxClients be big enough to handle as many simultaneous
requests as you expect to receive, but small enough to assure that there is enough
physical RAM for all processes.
…et mon axiome personnel :It's better to give a client a 503 page than knock the server down
. :)
Solution 3 :
Désactivez Keepalives et définissez MaxClients sur 150. La raison la plus probable pour laquelle vous avez 260 processus assis là-bas est qu'Apache maintient consciencieusement les connexions du navigateur ouvertes car KeepAlive est défini dans votre fichier de configuration apache.