ah le classique scheduler I/O. si t'es sur du NVMe avec un bon HBA coté host et que t'as du LVM sur LVM ça sent le `none` ou `mq-deadline` coté host et `none` ou `noop` coté guest. `noop` c'est bien quand le stockage gère déjà tout l'ordonnancement.
totalement d'accord avec `none` ou `noop` sur les deux niveaux. mais surtout, il faut regarder si tu as pas un souci de driver NVMe sur le host. et est-ce que ton hyperviseur est bien tuné pour les NVMe ? genre pas de sur-allocation de CPU ou de mémoire qui flinguerait les queues I/O.
le `none` scheduler est souvent le meilleur pour les NVMe parce qu'ils ont leur propre intelligence pour optimiser les accès. mais si tu as du LVM, tu as une couche de plus. t'as vérifié les block sizes de tes filesystems et de tes LVMs ? des fois un mismatch peut pénaliser un peu.
le scheduler sur le host est `mq-deadline`. j'avais mis `noop` sur le guest. j'ai testé `none` sur le guest pareil. je vais tenter `none` sur le host aussi. les block sizes sont default 4k partout. c'est une VM KVM/QEMU, je suis pas sûr des drivers NVMe du host.
si le host est en `mq-deadline` c'est pas idéal pour le NVMe. mets `none` sur le host pour les NVMe. et côté guest essaie `none` ou `kyber` (si ton kernel guest le supporte bien). `kyber` est pas mal pour les workloads mixtes.
ouais et un truc tout con mais qui arrive souvent : est-ce que ton LVM coté guest est bien en mode `cache=writethrough` si tu as des caches ? des fois un `writeback` mal géré peut donner des latences cheloues. et la taille de tes queues I/O aussi. `cat /sys/block/nvme0n1/queue/nr_requests`.
ok j'ai mis `none` partout (host nvme, guest lvm). et j'ai regardé `nr_requests` c'est à 128 par défaut. les latences ont un peu baissé mais c'est pas encore parfait. j'ai toujours des pics de latence. je commence à suspecter le LVM sur LVM. est-ce que c'est une bonne idée cette architecture ?
LVM sur LVM c'est pas l'idéal pour les perfs pures. chaque couche ajoute un overhead. si tu peux simplifier ça serait mieux. genre LVM direct sur NVMe et ta VM prend un LV directement. ou carrément passer le NVMe en passthrough à la VM si c'est une VM unique sur ce NVMe. ça élimine l'hyperviseur de la boucle I/O.
je vais tester de simplifier le stack LVM et voir pour le passthrough si c'est possible. ça expliquerait les pics. merci pour toutes ces pistes c'est super utile !
Vous devez être connecté pour poster un message !
Recevoir les derniers articles gratuitement en créant un compte !
S'inscrire
alaine
Membre depuis le 10/08/2019actif
salut la team sysadmin ! j'ai un souci de perfs I/O sur une VM linux (ubuntu 22.04, kernel 6.2) toute neuve qui tourne sur un serveur physique avec des NVMe super rapides. la VM a son disque sur un LVM au-dessus d'un LVM sur l'NVMe directement. je vois des pics de latence à 50ms sur des opérations qui devraient prendre 1-2ms. l'appli gueule grave. j'ai mis le scheduler I/O à `noop` sur l'OS guest mais ça change rien.