58 votes

Comment puis-je empêcher le déclenchement de tonnes de processus apache lorsque je lance Apache et que je vais tuer ma machine?

J'ai une forte circulation de l'application sur une machine debian et apache a commencé à agir étrange.

Chaque fois que je démarre apache, des tonnes de processus apache sont générés, l'application ne se charge pas du tout, et très rapidement l'ensemble de la machine se bloque et doit être powercycled à redémarrer.

Voici ce que je reçois pour le haut immédiatement après le démarrage d'apache:

top - 20:14:44 1:16, 2 users, load average: 0.48, 0.10, 0.03
Tâches: 330 total, 5 en cours d'exécution, 325 dormir, 0 arrêté, 0 zombie
Processeur(s): 12.0%aux états-unis, de 21,4%sy, 0.0% ni, à 65,7% id, de 0,2%wa, 0,1% de salut, de 0,7% si, 0.0%st
Mem: 8179920k total, 404984k utilisé, 7774936k gratuit, 60716k tampons
Swap: 2097136k total, 0 k 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 apache2 processus.

Moins d'une minute plus tard, vous pouvez voir ci-dessous que la charge a augmenté de 0,48 à 2.17. Si je ne m'arrête pas apache sur ce point, la charge continue d'augmenter pendant quelques minutes ou moins, jusqu'à ce que la machine meurt.

top 20:15:34 1:17, 2 users, load average: 2.17, 0.62, de 0,21
Tâches: 1850 total, 5 en cours d'exécution, 1845 dormir, 0 arrêté, 0 zombie
Processeur(s): 0.3% de nous, soit 2,1% de sy, 0.0% ni, de 96,4%id, 0.0%wa, 0,1% de salut, de 1,0% si, 0.0%st
Mem: 8179920k total, 1938524k utilisé, 6241396k gratuit, 60860k tampons
Swap: 2097136k total, 0 k utilisé, 2097136k gratuit, 44196k mis en cache

Nous avons un pare-feu où nous nous de liste blanche les adresses que nous connaissons sont autorisés à frapper notre site.

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

Merci!

42voto

MarkR Points 37178

Vous avez probablement fait l'erreur de configuration d'Apache pour utiliser beaucoup plus que l'ensemble de votre ram. C'est une erreur facile à faire.

Je suis en supposant que vous utilisez un Prefork Apache, et un processus de serveur d'applications (comme le PHP ou l'mod_perl). Dans ce modèle, vous allez vous retrouver avec un maximum de (MaxClients * au maximum l'utilisation de la mémoire de votre demande par un processus) mémoire utilisée. Si vous n'avez pas près, c'est le temps de diminuer l'un, l'autre ou les deux.

Dans le cas général, cela signifie que la diminution de MaxClients au point où votre serveur dispose de suffisamment de ram pour faire face.

Les valeurs par défaut généralement utilisé pour MaxClients (150 est typique) ne sont pas adaptés pour l'exécution d'un processus lourd serveur d'application sur une modeste machine si vous utilisez le Prefork modèle (la Plupart des serveurs d'application ne prend pas en charge, ou de décourager l'utilisation de modèles à filetages).

Toutefois, la diminution de MaxClients finira par causer la demande afin de devenir disponibles, en particulier si vous avez des connexions actives et le keepalive délai d'attente trop long. Les processus qui sont juste de garder un lien vivant (état K dans l'état du serveur utilisent encore beaucoup de RAM, et c'est peut-être un problème essayer de minimiser keepalive délai d'attente, ou de l'éteindre complètement.

Vous avez besoin de garder un œil sur l'état du serveur (fournies par le module mod_status).

Bien sûr, vous ne devez prendre AUCUNE de ces modifications, si vous comprenez les conséquences. Réfléchir à deux fois, changer la config une fois. Si vous avez la capacité de test de la charge simulée sur un spec similaire à la non-production de la machine, faites-le.

17voto

David Okwii Points 787

ps -aux | grep apache pour trouver le nombre de processus apache est en cours d'exécution sur. Regarder dehors pour le "RSS" colonne qui donne une estimation de la quantité de mémoire utilisée par chaque processus. Alternativement, vous pouvez utiliser le bouton "haut", où vous maj + f, puis sélectionnez l' %MEM colonne pour trier les processus par l'utilisation de la mémoire.

Le nombre de processus est déterminé par "MaxClients" directive dans votre apache.fichier conf. La façon dont vous arrivez à cette figure est décrite par cette page;

  1. SSH sur votre serveur en tant que root.
  2. Top.
  3. Appuyez sur maj + m.
  4. La Note la plus haute RES mémoire utilisée par httpd.
  5. Hit Q pour quitter haut.
  6. Exécuter: service httpd stop
  7. Une fois le serveur httpd arrêté, exécuter: gratuit -m
  8. Remarque la mémoire répertorié sous "utilisé".
  9. Trouver la garantie de la mémoire de votre plan VPS. Le soutien peut vous dire combien vous avez la garantie si vous ne pouvez pas le trouver.
  10. Soustraire la quantité de mémoire UTILISÉE à partir de la mémoire que votre plan est GARANTI. Cela vous donnera votre base de libérer de la MÉMOIRE de la PISCINE.
  11. Multipliez la valeur de la quantité de MÉMOIRE LIBRE de la PISCINE de 0,8 pour trouver votre moyen DISPONIBLE APACHE PISCINE (cela vous permettra de 20% de la mémoire de réserve pour les pics de périodes).
  12. Divisez votre DISPOSITION APACHE PISCINE par la plus haute RES mémoire utilisée par httpd. Cela vous donnera la MaxClients valeur qui devrait être fixé pour votre système.

La valeur du "MaxClients" permettra d'assurer le droit à l'allocation de la mémoire de votre serveur apache. Voilà comment je l'ai résolu.

11voto

kdgregory Points 21849

Avez-vous modifié votre fichier de configuration récemment? Si oui, je vous fait confiance pour garder l'ancienne version pour la comparaison?

Si non, la recherche du "StartServers", "MaxSpareServers" et "MinSpareServers des" directives". En général, vous voulez laisser à ces valeurs par défaut, mais il est possible qu'elles aient été volontairement fixé en haut (mauvaise idée) ou accidentelle de cette façon en raison d'une mauvaise config modifier.

Si cela ne vous aide pas, il est temps de regarder à l'extérieur Apache, pour certains processus de l'ouverture des connexions à un rythme rapide (peut-être qu'il y a un processus de test qui se déchaînent).

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

3voto

Cory R. King Points 1634

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

Si vous trouvez que vous obtenez martelé avec le trafic réel (et non pas un mal configuré StartServers/Min/MaxSpareServers), il ya quelques autres choses que vous pouvez faire:

  1. Créer une nouvelle, léger processus apache (ou lighttpd) pour votre contenu statique. De cette façon, tous les la petite, statique n'est pas "polluer" votre "poids lourds" de l'app processus. Cela peut être sur le même serveur, ou d'une autre. Ne pas de la matière.
  2. Mettre un reverse proxy comme les Calmars dans avant de votre processus Apache. L' proxy inverse rapidement sucer vers le bas le contenu de Apache et de le stocker dans la mémoire, puis de colis de retour pour le client. De cette façon, AOL les utilisateurs sur 14,4 kb modems n'est pas un porc de votre précieux Apache machines à sous. En tant que en bonus, une telle configuration peut être configuré pour mettre en cache certaines de vos contenu de réduire la charge sur votre Processus Apache.

2voto

Brandon Points 63

Votre " top " de sortie montre que vous avez beaucoup de mémoire libre, donc je ne pense pas que MaxClients est un problème (sauf si il y a un problème avec Apache allouer plus de 2 go de mémoire?) Votre journal d'erreurs devraient montrer les erreurs si elle est d'avoir des difficultés à créer plus d'enfants.

Très probablement, votre processus Apache sont vraiment à l'aide de beaucoup de ressources. Si vous utilisez PHP apps, essayez d'installer eAccelerator qui fait un bon travail d'optimisation et de mise en cache de code PHP. D'autres choses pourraient inclure des requêtes MySQL, une lente résolveur DNS, etc. Au-delà, il devient de plus en plus dans la compréhension de ce que sont les programmes frappé et ce qu'ils font.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X