IOps de merde sur mon serveur MySQL malgré des SSD NVMe

dlaroche 16/05/2024
RÉSOLU
dlaroche
Auteur Actif
Avatar de dlaroche
dlaroche
Auteur Actif

yo la team j'ai un serveur mysql avec du nvme (genre super rapide sur le papier) mais en prod j'ai des perf iops à chier. fdisk -l me montre bien mes disques nvme et un fio benchmark en direct io me donne des perf de dingue genre 100k iops. mais quand mysql tourne c'est la cata j'ai l'impression de bosser avec des hdd. j'ai 16 cores 64gb ram debian 11

16/05/2024 à 04:47

7 commentaires

goncalves-michelle
Membre Actif Secouriste
Avatar de goncalves-michelle
goncalves-michelle
Membre Actif Secouriste

slt ! c'est classique avec mysql. t'as quel scheduler i/o sur tes nvme ? deadline noop cfq ? pour les nvme c'est noop ou none qu'il faut en général. et mysql utilise bien de l'i/o asynchrone ? regarde innodb_flush_method = O_DIRECT_NO_FSYNC ou O_DIRECT dans ta config mysql

17/05/2024 à 02:28
dlaroche
Auteur Actif
Avatar de dlaroche
dlaroche
Auteur Actif

alors le scheduler est cfq par défaut. je peux le passer à noop sans problème. pour O_DIRECT_NO_FSYNC je l'ai pas dans ma config. c'est quoi le mieux entre O_DIRECT et O_DIRECT_NO_FSYNC ? et comment je check si l'i/o asynchrone est vraiment utilisé côté mysql

18/05/2024 à 00:19
goncalves-michelle
Membre Actif Secouriste
Avatar de goncalves-michelle
goncalves-michelle
Membre Actif Secouriste

pour nvme clairement passe à noop ou none. cfq c'est pour les hdd. O_DIRECT_NO_FSYNC est souvent le plus perf pour mysql sur du ssd si t'as une batterie de cache (bbu) sur ton raid controller mais si c'est du nvme direct sans raid hardware O_DIRECT est plus safe et souvent suffisant. pour l'i/o asynchrone mysql utilise par défaut libaio mais tu peux tester avec io_uring si ton kernel est récent (5.1 ou plus) c'est encore plus efficient

# changer le scheduler
echo noop > /sys/block/nvme0n1/queue/scheduler
18/05/2024 à 19:47
dlaroche
Auteur Actif
Avatar de dlaroche
dlaroche
Auteur Actif

ok j'ai mis noop et O_DIRECT. j'ai vu un léger mieux mais c'est pas encore ça. mon kernel est 5.10 donc io_uring c'est bon. comment je dis à mysql d'utiliser io_uring ? c'est une option de config ? j'ai l'impression que c'est pas direct

19/05/2024 à 14:47
goncalves-michelle
Membre Actif Secouriste
Avatar de goncalves-michelle
goncalves-michelle
Membre Actif Secouriste

oui c'est pas direct dans mysql. il faut que ton système d'exploitation le supporte et que mysql soit compilé avec le support. mais ce qui est plus important c'est de régler les nr_requests pour la queue d'i/o de tes disques. c'est le nombre max de requêtes i/o en attente. pour du nvme faut mettre un chiffre élevé genre 2048 ou 4096. le défaut est souvent 128

# vérifier l'actuel
cat /sys/block/nvme0n1/queue/nr_requests
# changer (à faire dans grub ou udev rules pour la persistance)
echo 4096 > /sys/block/nvme0n1/queue/nr_requests
Modifié le 23/05/2026 à 16:20
dlaroche
Auteur Actif
Avatar de dlaroche
dlaroche
Auteur Actif

aha ! j'ai passé nr_requests à 4096 et là miracle. mes iops sont revenus à la vie. le combo noop + o_direct + nr_requests haut c'était ça. en plus j'ai vu des articles qui disent que mysql 8.0 supporte mieux io_uring donc j'ai bon. merci pour l'aide mec

21/05/2024 à 09:48
goncalves-michelle
Membre Actif Secouriste
Avatar de goncalves-michelle
goncalves-michelle
Membre Actif Secouriste

nickel ! content que ça ait marché. c'est souvent ces petits réglages kernel qui font la différence sur les nvme. hésite pas à bench un peu plus finement ton setup pour voir si t'as le max de perf possible

22/05/2024 à 03:58

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