perf i/o nvme pas ouf sur prod

Posté par margot30 le 05/08/2024
RÉSOLU

margot30

Membre depuis le 05/11/2023

actif

salut la team. j'ai un souci de perf i/o sur nos serveurs de prod qui ont des nvme. on s'attendait à des millions d'iops mais on est loin du compte sur un workload db (cassandra). on voit des latences par moment et la bande passante est pas maxée. on a bien des nvme samsung pm9a3. la machine est sous ubuntu 22.04. je pense à un truc au niveau du kernel ou des drivers. des idées ?

# petite commande pour voir le scheduler
cat /sys/block/nvme0n1/queue/scheduler

Commentaires

chamel

Membre depuis le 18/05/2019

actif secouriste

hello. avec du nvme il faut absolument que l'i/o scheduler soit sur

none
. pas
mq-deadline
ni
noop
. les nvme gèrent leur propre ordonnancement c'est mieux. tu as vérifié ça ?

ugautier

Membre depuis le 15/07/2024

actif

et aussi les options de mount de ton filesystem. genre

noatime
c'est un classique pour éviter des writes inutiles sur chaque read. et si c'est du xfs/ext4, la taille des blocs ?
discard
pour le trim si tu veux mais attention ça peut aussi impacter les perfs en charge

chamel

Membre depuis le 18/05/2019

actif secouriste

une fois le scheduler bien configuré, benchmarke avec

fio
pour isoler le problème. sans ça c difficile de dire si ça vient de la db ou de l'infra disque. un simple
fio --name=test --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4k --size=1G --numjobs=1 --direct=1 --filename=/dev/nvme0n1
peut donner un bon aperçu

margot30

Membre depuis le 05/11/2023

actif

merci pour les retours. alors pour le scheduler :

# cat /sys/block/nvme0n1/queue/scheduler
[mq-deadline] kyber bfq none
il est sur
mq-deadline
par défaut. pour les options de mount j'ai bien
noatime
. j'ai pas mis
discard
. je vais essayer de changer le scheduler

zacharie-adam

Membre depuis le 12/04/2019

actif

oui clairement

mq-deadline
c'est pas fait pour du nvme. c'est pour les disques rotatifs ou certains sdd sata. pour du nvme il faut le mettre sur
none
ça laisse le hardware nvme gérer l'ordonnancement. tu peux le changer à chaud avec
echo none > /sys/block/nvme0n1/queue/scheduler
mais pour que ça survive au reboot il faut un udev rule ou le passer en paramètre kernel

margot30

Membre depuis le 05/11/2023

actif

ok je viens de passer le scheduler en

none
sur un noeud de test. je relance mes tests db et
fio
.
# echo none > /sys/block/nvme0n1/queue/scheduler
# cat /sys/block/nvme0n1/queue/scheduler
mq-deadline kyber bfq [none]
déjà le
fio randwrite
est deux fois plus rapide en iops. c'est bon signe !

chamel

Membre depuis le 18/05/2019

actif secouriste

top ! après avoir changé le scheduler tu peux aussi regarder

nr_requests
(le nombre de requêtes i/o en attente) et
read_ahead_kb
dans le même répertoire
/sys/block/nvme0n1/queue/
. des fois les valeurs par défaut sont pas optimales pour des gros workloads

ugautier

Membre depuis le 15/07/2024

actif

et n'oublie pas la config de cassandra aussi. genre

commitlog_sync_period_in_ms
ou
fsync
pour les data directories. une db mal tunée peut annuler les gains du disque. mais le scheduler est une excellente première étape

margot30

Membre depuis le 05/11/2023

actif

c'était bien ça le scheduler. après le passage à

none
et quelques réglages
read_ahead_kb
(passé à 128k) et
nr_requests
(passé à 1024), j'ai vu une amélioration notable. les latences ont baissé drastiquement. on va déployer ça partout. thx pour l'aide précieuse !

chamel

Membre depuis le 18/05/2019

actif secouriste

nickel, good job ! les schedulers c'est souvent un piège sur les nvme

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

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

S'inscrire