Je sèche un peu, j'ai besoins de votre aide.
J'ai plusieurs machine virtuel qui tourne sur un serveur dédié.
Le serveur et toutes ces VM sont sous Arch.
Pour ça j'utilise qemu avec kvm.
Typiquement je les lance comme ca :
Code : Tout sélectionner
/usr/bin/qemu-system-x86_64 -enable-kvm -cpu host -nodefaults -monitor telnet:localhost:12444,server,nowait -smp 1 -m 2048 -vnc localhost:42 -boot order=c -drive file=demo/demo.img,if=virtio -net nic,model=virtio,macaddr=42:AA:FF:EF:A8:5C -net user -redir tcp:12340::80 -redir tcp:12341::443 -redir tcp:12342::22
J'ai un apache qui tourne en "reverse proxy", a coup de ProxyPass et ProxyPassReverse. Ceci me permet de fait pointer mes differents "Virtual Host" vers les VM qui vont bien.
Code : Tout sélectionner
ProxyPass /error !
ProxyPass / http://localhost:12340/
ProxyPassReverse / http://localhost:12340/
Plus un fail2ban qui surveille les logs apaches (Donc aussi iptables).
Sur les guest (VM) , j'ai aussi un serveur apache qui tourne, la plupart du temps avec PHP et MariaDB.
En fonction des VM j'ai un ou plusieurs CMS d'installé, des pages statiques (html), ou des projets persos.
Mon problèmes est que, après un certain temps (entre 12 et 72 h), j'ai une ou plusieurs vm qui partent en vrillent, mais jamais toutes en même temps, et pas toujours les mêmes.
Du coter serveur, je remarque 100% d'utilisation du cpu pour le processus qemu.
Alors je ne peux plus me connecté sur les VM impacté, que ce soit par le web (Firefox) ou par ssh.
Si j'ai déjà une sessions ouverte sur le guest, je ne suis pas déconnecté et avec un top, je peux me rendre compte que le load est souvent ridicule (inférieur à 1)
Les VM impactés ne répondent plus au signaux de l'utilisateur qui lance qemu, pour faire un kill je suis obligé de le faire en tant que root.
A noter que ça n'impacte pas les autres VM, qui reste accessible et "calme" d'un point de vue CPU.
J'ai aussi remarqué sans trop savoir si c'est la conséquence ou la cause, que des connections en FIN_WAIT2 s'accumule et ne se termine jamais.
Je n'ai pas touché a la configuration tcp par défaut, et je pense que normalement il y a un timeout pour ce genre de chose.
Typiquement avec netstat je vois des choses comme ca :
Code : Tout sélectionner
tcp 0 0 127.0.0.1:12340 127.0.0.1:41847 FIN_WAIT2
Ce nombre de wait augmente régulièrement, pour atteindre en moins de 24h, entre 1000 et 1500.
Avant hier je suis passer à virtio pour le driver qemu de disque dur et réseau,
je n'ai pas encore constaté d'utilisation abusive du CPU même si je remarque toujours de gros écart entre ce qui est annoncé sur le serveur et sur les VM.
A noter que j'ai rebooter plusieurs fois depuis (pour d'autre raison) et donc je ne sais pas encore si ça règle mon problème de CPU.
De plus ça n'a visiblement aucun impacte sur le nombre de FIN_WAIT2 (qui s'accumule toujours)
J'ai pensé a faire un cron qui compte le nombre de FIN_WAIT2 et reboot le serveur a partir de 500, mais je ne pense pas que c'est une solution sur le long terme
Alors voila, j'aimerais savoir comment je peux faire pour :
- trouver la cause des ces FIN_WAIT2 qui reste
- trouver comment forcer le noyau Linux a appliquer les timeout par défaut de tcp
- trouver la cause de ces montés de CPU
Aussi si vous avez des solutions, des idées, ou des questions n’hésitez pas, toutes les pistes sont bonnes à suivre.