Sujet :

Kernel Linux : iowait très élevé sur nvme avec faible débit

RÉSOLU

Liste des sujets Répondre Créer un sujet

nicole-andre

Membre depuis le 24/08/2024

salut les linuxiens ! j'ai un souci bizarre sur un de nos serveurs de base de données. il a un nvme tout neuf qui est censé être ultra rapide, mais iostat me montre un %iowait qui tape dans les 50-70% alors que le débit disque est ridicule genre 10-20 MB/s max. en gros le disque attend tout le temps mais ne fait rien. le CPU est pas saturé. qu'est-ce qui peut causer ça sur un nvme ?

iostat -x 1
# ...
# avg-cpu:  %user   %nice %system %iowait  %steal   %idle
#           10.00    0.00    5.00   65.00    0.00   20.00
# Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm  r_await  w_await aqu-sz  areq-sz  asvc-t  %util
# nvme0n1         50.00   100.00   500.00    1000.00     0.00     0.00   0.00   0.00   50.00   100.00    0.10     10.00    0.60   0.90
# (les stats ci-dessus sont un exemple, pas les vraies valeurs, mais on voit bien le %iowait très haut et r/w/kB/s très bas)

sebastien-thibault

Membre depuis le 15/08/2024

salut ! le %iowait élevé avec un faible débit c'est souvent plein de petites requêtes I/O aléatoires qui saturent le queue depth ou un truc côté kernel. vérifie déjà le scheduler disque. sur un NVMe moderne tu devrais être en mq-deadline ou noop. si tu es encore en cfq ou bfq ça peut créer des latences de ouf.

cat /sys/block/nvme0n1/queue/scheduler

martineau-sebastien

Membre depuis le 11/08/2024

ouais et vois aussi quel processus est responsable de ces i/o. iotop ou pidstat -d 5 peuvent t'aider à identifier le coupable. parfois c'est juste un truc qui fait plein de petits fsync() ou qui lit des tonnes de petits fichiers sans buffering. ça tue la performance.

anouk58

Membre depuis le 02/05/2024

autre piste : la taille du block size de ton système de fichiers et des requêtes de l'appli. si ton appli écrit en blocs de 4KB et ton FS est en 4KB mais que le disque préfère du 512B ou du 8KB ça peut générer du overhead. mais bon sur NVMe c'est rare que ça soit si critique. t'as vérifié les trim opérations ?

caroline49

Membre depuis le 15/07/2024

est-ce que ton applicatif fait des direct I/O ou utilise le cache du kernel ? si c'est du direct i/o ça bypass le cache et toutes les petites écritures sont directement flushées au disque. sur un nvme c'est souvent bien mais si l'appli en fait trop ça peut être pire. fais un test avec fio pour voir les perfs brutes du disque et compare avec ce que ton app fait

nicole-andre

Membre depuis le 24/08/2024

ok un grand merci à tous pour les pistes ! c'était bien le scheduler, il était sur mq-deadline donc ça c'était bon. par contre, en utilisant iotop j'ai vu que c'était notre service de base de données (un truc custom) qui faisait des milliers de petites écritures de 4KB avec O_DIRECT à chaque fois. le combo o_direct + petites writes = iowait de fou même sur un nvme. j'ai pu modifier l'appli pour bufferiser un peu plus les écritures et le %iowait est retombé à 5% avec un débit bien plus sain. ouf !

Répondre

vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire