Comment puis-je empêcher des tonnes de processus apache de se produire lorsque je lance apache et que je procède à la destruction de ma machine?

J’ai une application très fréquentée sur une machine Debian et Apache a commencé à agir bizarrement.

Chaque fois que je lance apache, des tonnes de processus apache sont générés, l’application ne se charge pas du tout, et très rapidement, la machine entière se bloque et doit être recyclée.

Voici ce que j’ai pour le top immédiatement après avoir lancé apache:

 top - 20:14:44 up 1:16, 2 utilisateurs, moyenne de la charge: 0.48, 0.10, 0.03
 Tâches: 330 au total, 5 en cours d'exécution, 325 en sumil, 0 arrêté, 0 zombie
 Cpu (s): 12,0% us, 21,4% sy, 0,0% ni, 65,7% id, 0,2% wa, 0,1% salut, 0,7% si, 0,0% st
 Mem: 8179920k total, 404984k utilisé, 7774936k gratuit, 60716k tampons
 Swap: 2097136k total, 0k utilisé, 2097136k gratuit, 43424k mis en cache


 10251 www-data 15 0 467m 8100 4016 S 6 0.1 0: 00.04 apache2
 10262 www-data 15 0 467m 8092 4012 S 6 0.1 0: 00.05 apache2
 10360 www-data 15 0 468m 8296 4016 S 6 0.1 0: 00.05 apache2
 10428 www-data 15 0 468m 8272 3992 S 6 0.1 0: 00.05 apache2
 10241 www-data 15 0 467m 8256 4012 S 4 0.1 0: 00.03 apache2
 10259 www-data 15 0 467m 8092 4012 S 4 0.1 0: 00.04 apache2
 10274 www-data 15 0 467m 8056 4012 S 4 0.1 0: 00.03 apache2
 10291 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.03 apache2
 10293 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.03 apache2
 10308 www-data 15 0 468m 8296 4016 S 4 0.1 0: 00.02 apache2
 10317 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.02 apache2
 10320 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.04 apache2
 10325 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.04 apache2

Et ainsi de suite .. avec plus de processus apache2.

Moins d’une minute plus tard, vous pouvez voir ci-dessous que le chargement est passé de 0,48 à 2,17. Si je n’arrête pas apache à ce stade, la charge continue d’augmenter pendant quelques minutes ou moins jusqu’à ce que la machine meure.

 top - 20:15:34 up 1:17, 2 utilisateurs, charge moyenne: 2,17, 0,62, 0,21
 Tâches: 1850 au total, 5 en cours d'exécution, 1845 en sumil, 0 à l'arrêt, 0 zombie
 Cpu (s): 0.3% us, 2.1% sy, 0.0% ni, 96.4% id, 0.0% wa, 0.1% salut, 1.0% si, 0.0% st
 Mem: 8179920k total, 1938524k utilisé, 6241396k gratuit, 60860k tampons
 Swap: 2097136k total, 0k utilisé, 2097136k gratuit, 44196k mis en cache

Nous avons un pare-feu où nous inscrivons en liste blanche les adresses que nous soaps autorisées à visiter notre site.

Toutes les idées sur ce que pourrait être le problème sont les bienvenues.

Merci!

Vous avez probablement fait l’erreur de configurer Apache pour utiliser beaucoup plus que tout votre RAM. C’est une erreur facile à faire.

Je suppose que vous utilisez un Prefork Apache et un serveur d’applications en cours de processus (tel que PHP ou mod_perl). Dans ce modèle, vous vous retrouverez avec un maximum de (MaxClients * utilisation maximale de mémoire de votre application par processus) mémoire utilisée. Si vous n’en avez pas autant, il est temps de diminuer l’un ou l’autre ou les deux.

Dans le cas général, cela signifie une diminution de MaxClients au point où votre serveur dispose de suffisamment de mémoire vive pour faire face.

Les valeurs par défaut généralement utilisées pour MaxClients (150 sont typiques) ne sont pas adaptées à l’exécution d’un serveur d’applications lourd sur un ordinateur modeste si vous utilisez le modèle Prefork (la plupart des serveurs d’application ne prennent pas en charge de modèles filetés).

Toutefois, si MaxClients diminue, l’application deviendra indisponible, en particulier si les keepalives sont activés et si le délai de conservation est trop long. Les processus qui ne font que maintenir une connexion active (état K dans l’état du serveur) utilisent toujours beaucoup de mémoire vive, ce qui peut poser problème – essayez de minimiser le délai d’expiration de la connexion permanente ou de l’éteindre complètement.

Vous devez garder un œil sur le statut du serveur (fourni par mod_status).

Bien sûr, vous ne devriez apporter AUCUN de ces changements si vous en comprenez les conséquences. Réfléchissez à deux fois, changez la configuration une fois. Si vous avez la possibilité de tester les modifications avec une charge simulée sur une machine de non-production de spécifications similaire, faites-le.

utiliser ps -aux | grep apache pour connaître le nombre de processus sur lesquels Apache s’exécute. Recherchez la colonne “RSS” qui donne une estimation de la mémoire utilisée par chaque processus. Sinon, vous pouvez utiliser “top”, où vous déplacez + f puis sélectionnez la colonne% MEM pour sortinger les processus en fonction de l’utilisation de la mémoire.

Le nombre de processus est déterminé par la directive “MaxClients” dans votre fichier apache.conf. La façon dont vous venez à cette figure est comme décrit par cette page ;

  1. SSH dans votre serveur en tant que root.
  2. Run top
  3. Appuyez sur Maj + m.
  4. Notez la plus haute mémoire RES utilisée par httpd.
  5. Appuyez sur Q pour quitter le haut.
  6. Execute: service httpd stop (Dans debian, sudo service apache2 stop )
  7. Une fois httpd arrêté, exécutez: free -m
  8. Notez la mémoire répertoriée sous “used”.
  9. Trouvez la mémoire garantie pour votre plan VPS. Le support peut vous dire combien vous avez garanti si vous ne le trouvez pas.
  10. Soustraire la mémoire utilisée de la mémoire que votre plan est garanti. Cela vous donnera votre base gratuite MEMORY POOL.
  11. Multipliez la valeur de votre POOL MEMOIRE GRATUIT par 0,8 pour trouver votre PISCINE APACHE DISPONIBLE moyenne (cela vous permettra une réserve de mémoire de 20% pour les périodes de rafale).
  12. Divisez votre POOL APACHE DISPONIBLE par la plus haute mémoire RES utilisée par httpd. Cela vous donnera la valeur MaxClients à définir pour votre système. (Arrondissez-le à l’entier le plus proche inférieur à cette valeur s’il comporte un composant fraction.)

La bonne valeur pour “MaxClients” assurera l’allocation de mémoire appropriée pour votre serveur Apache. C’est comme ça que je l’ai résolu.

Dans Debian, le fichier de configuration apache est à /etc/apache2/apache2.conf

Avez-vous modifié votre fichier de configuration récemment? Si oui, je pense que vous conservez l’ancienne version pour la différencier?

Sinon, recherchez les directives “StartServers”, “MaxSpareServers” et “MinSpareServers”. En général, vous voulez les laisser aux valeurs par défaut, mais il est possible qu’elles aient été intentionnellement définies trop haut (mauvaise idée) ou définies de manière accidentelle en raison d’une mauvaise configuration de configuration.

Si cela n’aide pas, il est temps de regarder en dehors d’Apache, pour certains processus qui ouvrent des connexions à un rythme rapide (il peut s’agir d’un processus de test qui tourne mal).

La première étape est le journal d’access. La deuxième étape consiste à exécuter netstat, pour voir d’où peuvent provenir les connexions. Et s’il fonctionne sur le même système, vous pouvez regarder dans / proc / * / fd pour trouver les deux extrémités de la connexion.

Comme cela a été dit (en supposant que Prefork Apache) – MaxClients = max processus à la fois.

Si vous constatez que vous êtes confronté à un trafic réel (et non à un StartServers / Min / MaxSpareServers mal configuré), vous pouvez faire d’autres choses:

  1. Configurez un processus Apache (ou lighttpd) distinct et léger pour votre contenu statique. De cette façon, toutes les petites choses statiques ne polluent pas votre processus d’application lourd. Cela peut être sur le même serveur ou sur un autre. N’a pas d’importance
  2. Placez un proxy inverse comme Squid devant votre processus Apache. Le proxy inverse va rapidement aspirer le contenu d’Apache et le stocker en mémoire, puis le restituer au client. De cette façon, les utilisateurs d’AOL sur les modems 14,4 ko ne consumnt pas l’un de vos précieux emplacements Apache. En prime, une telle configuration peut être configurée pour mettre en cache une partie de votre contenu afin de réduire la charge de vos processus Apache.

Cette question est ancienne, mais je me sens obligé d’append une réponse ici car toutes les réponses existantes ne tiennent pas compte d’une information clé de l’OP: après que le chargement ait commencé à augmenter pendant quelques minutes, Ressources CPU et mémoire disponibles. Il rest habituellement un coupable, et c’est une I / O.

Vérifiez s’il existe une partition complète avec df -h . Si ce n’est pas le cas, voyez si votre application écrase le disque en utilisant vmstat 1 10 ou iostat 1 10 (ceux-ci sont fournis par le package ‘sysstat’ sur Debian / Ubuntu). Si vous ne voyez toujours aucun problème, vous rencontrez peut-être des erreurs d’E / S au niveau de l’appareil ou des problèmes de réseau pour le stockage monté sur le réseau. Vérifiez les fichiers journaux du système et du démon.

Votre sortie ‘top’ indique que vous avez beaucoup de mémoire libre, donc je ne pense pas que MaxClients soit un problème (sauf si Apache alloue plus de 2 Go de mémoire?) Votre journal des erreurs devrait afficher des erreurs si avoir des problèmes pour créer plus d’enfants.

Très probablement, vos processus Apache utilisent beaucoup de ressources. Si vous exécutez des applications PHP, essayez d’installer eAccelerator, qui optimise et met en cache le code PHP. D’autres choses peuvent inclure des requêtes MySQL lourdes, un résolveur DNS lent, etc. Au-delà, cela permet de mieux comprendre quels programmes sont touchés et ce qu’ils font.