3 votes

Mon VPS s'est effondré et je ne sais pas pourquoi.

J'ai un VPS avec Linode en ce moment. J'ai été alerté par mon service de surveillance qu'un site que j'hébergeais était tombé en panne. J'ai utilisé Lish, la méthode de Linode pour obtenir un accès direct hors bande à la console via une connexion SSH mais sans utiliser SSH, pour voir les messages d'erreur. Voici ce que j'ai vu :

console log

J'ai vérifié les journaux de Munin pour voir s'il y avait un pic dans l'utilisation de la mémoire, et en effet il y a un pic au moment approprié pour le graphique de swap :

swap memory spike

Cependant, il n'y a pas de pic sur le graphique de la mémoire (bien que le swap semble augmenter). légèrement ) :

memory graph, no spike

J'ai redémarré le serveur et il fonctionne bien depuis. J'ai vérifié les journaux d'accès et d'erreur d'Apache et n'ai rien vu de suspect. La dernière entrée dans le syslog avant le redémarrage du serveur était une erreur avec le démon IMAP et ne semble pas être liée :

Oct 28 18:30:35 hostname imapd: TIMEOUT, user=user@xxxxxxxxxxxxx.com, ip=[::ffff:XX.XX.XX.XX], headers=0, body=0, rcvd=195, sent=680, time=1803
# all of the startup logs below here
Oct 28 18:40:33 hostname kernel: imklog 5.8.1, log source = /proc/kmsg started.

J'ai essayé de vérifier dmesg mais je n'ai rien vu de suspect non plus. Les dernières lignes :

VFS: Mounted root (ext3 filesystem) readonly on device 202:0.
devtmpfs: mounted
Freeing unused kernel memory: 412k freed
Write protecting the kernel text: 5704k
Write protecting the kernel read-only data: 1384k
NX-protecting the kernel data: 3512k
init: Failed to spawn console-setup main process: unable to execute: No such file or directory
udevd\[1040\]: starting version 173
Adding 524284k swap on /dev/xvdb.  Priority:-1 extents:1 across:524284k SS
init: udev-fallback-graphics main process (1979) terminated with status 1
init: plymouth main process (1002) killed by SEGV signal
init: plymouth-splash main process (1983) terminated with status 2
EXT3-fs (xvda): using internal journal
init: plymouth-log main process (2017) terminated with status 1
init: plymouth-upstart-bridge main process (2143) terminated with status 1
init: ssh main process (2042) terminated with status 255
init: failsafe main process (2018) killed by TERM signal
init: apport pre-start process (2363) terminated with status 1
init: apport post-stop process (2371) terminated with status 1

J'ai essayé de trouver le message d'erreur sur Google ( kernel BUG at mm/swapfile.c:2527! ) et a trouvé quelques sujets liés à Xen (Linode utilise Xen) :

Cependant, aucune des informations que j'ai trouvées ne semblait indiquer une solution. Je vais mettre à niveau vers le dernier noyau que Linode propose (de 2.6.39.1-linode34 a 3.0.4-linode38 ).

Y a-t-il autre chose que je puisse faire pour diagnostiquer ce problème maintenant, ou à l'avenir si cela devait se reproduire ? Y a-t-il quelque chose que j'ai manqué ? Quelqu'un a-t-il une idée de ce qui a pu déclencher ce problème ?

Veuillez me faire savoir si je peux vous fournir d'autres informations. Merci beaucoup.

2voto

Sean Reifschneider Points 10110

Avez-vous tiré les graphiques de Munin avant ou après avoir redémarré le système ? Si c'est après, la partie après la section vide est probablement APRÈS vous avez redémarré, et n'est pas pertinent. Je pense que c'est après, parce que l'utilisation de l'espace de stockage a considérablement diminué...

Dans votre question, vous ignorez la section vide... Vous dites que "le graphique ne montre pas d'augmentation de l'utilisation de la mémoire", mais ce qu'il montre vraiment, c'est l'absence de données pendant la période où la mémoire était susceptible d'augmenter. munin est un excellent outil, mais il est terrible pour signaler des cas comme celui-ci, car il ne rapporte des informations que toutes les 5 minutes et si le système est occupé, il peut ne rien rapporter du tout.

Avez-vous fait le calcul de la mémoire pour le nombre d'instances d'Apache que vous pouvez exécuter ? Cela signifie que vous devez faire "ps awwlx --sort=rss | grep apache" et regarder combien de mémoire chaque instance d'Apache utilise. Par exemple :

root@theobromine:~# ps awwlx --sort=rss | grep apache
0     0 18497 18485  20   0   1788   528 -      S+   pts/0      0:00 grep apache
5    33 18458  5384  20   0  28468  6700 -      S    ?          0:00 /usr/sbin/apache2 -k start
5    33 18470  5384  20   0  28468  6700 -      S    ?          0:00 /usr/sbin/apache2 -k start
5    33 18480  5384  20   0  28468  6700 -      S    ?          0:00 /usr/sbin/apache2 -k start
5    33 18481  5384  20   0  28468  6700 -      S    ?          0:00 /usr/sbin/apache2 -k start
5    33 18457  5384  20   0  28468  6708 -      S    ?          0:00 /usr/sbin/apache2 -k start
5     0  5384     1  20   0  28336 11796 -      Ss   ?          0:16 /usr/sbin/apache2 -k start

C'est cette huitième colonne qui nous intéresse. Dans ce cas, il utilise 6,7 Mo pour chaque instance, ce qui est en fait assez peu. Mais maintenant je regarde combien de mémoire j'ai :

root@theobromine:~# free
             total       used       free     shared    buffers     cached
Mem:        775196     643848     131348          0      77964     268788
-/+ buffers/cache:     297096     478100
Swap:      1148636       3368    1145268

J'ai donc 800 Mo de RAM... Maintenant, je peux faire le calcul et dire que dans le meilleur des cas, je peux faire tourner 800/6,7 = 119 instances d'Apache. Mais cela ne laisse aucun espace pour les autres applications, le système d'exploitation, le cache, etc...

Mais en fait, vous avez 478MB (deuxième colonne sous "free") au maximum, moins la quantité d'Apaches en cours d'exécution (6.7*6 -- je n'avais que 6 instances d'Apache en cours d'exécution ci-dessus), ce qui laisse environ 520MB de RAM (si vous n'avez pas de cache, bien sûr). Donc le maximum que je peux réellement faire tourner est plutôt de 77 instances.

Alors, combien j'en exécute réellement ?

root@theobromine:~# grep MaxClients /etc/apache2/apache2.conf
# MaxClients: maximum number of server processes allowed to start
    MaxClients          150
# MaxClients: maximum number of simultaneous client connections
    MaxClients          150

Ah, Apache ne me limite pas à moins de mémoire que ce que j'ai. Donc, si plus de 77 clients se connectent à mon serveur web en même temps, il est probable que je commence à avoir des problèmes.

Je vois cela assez fréquemment : "Je dois être capable de gérer 500 connexions web simultanées." Mais ensuite, vous regardez leurs instances Apache et ils utilisent 60 Mo (ce qui n'est pas rare), mais ils paniquent quand vous leur dites qu'ils doivent faire passer leur VPS à 32 Go de RAM. :-)

2voto

Tom Marthenal Points 2076

Le problème était lié au bug de Xen (mentionné dans la question). La mise à jour vers la dernière version du noyau ( 3.0.4-linode38 ) a résolu les problèmes (le serveur plantait de manière répétée jusqu'à ce que je change la version du noyau). Les problèmes semblent avoir été causés non pas par un manque de mémoire, mais par une mauvaise gestion de la mémoire par le noyau (ou un bogue dans Xen).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X