Gros lags sur des écritures disques intenses avec db postgres

Posté par francois-guillet le 24/03/2025
RÉSOLU

francois-guillet

Membre depuis le 23/07/2019

salut ! on a une instance postgres sur un vm linux qui prend cher niveau i/o. dès qu'on a des pics d'écriture ça lag de ouf genre des requêtes qui prennent des secondes. pourtant on est sur des nvme locaux. je suis sur un kernel récent (5.15) c'est ptete un souci d'io scheduler non ?


# fstab exemple
UUID=xxxx /var/lib/postgresql ext4 defaults,noatime,discard 0 2

Commentaires

susanne-marchal

Membre depuis le 08/01/2025

hello. nvme locaux c'est bien mais quel type de nvme ? et quel est l'io scheduler actuel ? tu peux vérifier avec `cat /sys/block/nvme0n1/queue/scheduler` ou `blockdev --report`

francois-guillet

Membre depuis le 23/07/2019

c'est des intel p4510. l'io scheduler est `none` apparemment pour les nvme par défaut sur mon os. j'ai essayé `noop` mais pas de changement notable. je pensais que `none` était l'idéal pour les disques rapides comme ça

maillet-elodie

Membre depuis le 21/07/2024

pour les nvme avec des kernels > 5.x `none` ou `noop` c'est le défaut mais pas forcément le meilleur. le `mq-deadline` est souvent plus performant dans ce genre de scenario avec des workloads intenses et multi-threadés

francois-guillet

Membre depuis le 23/07/2019

ah mq-deadline j'en ai entendu parler. j'ai les stats iostat je vois pas mal de `await` et `svctm` élevés. je vais tenter de changer pour `mq-deadline` sur le nvme où il y a postgres


# exemple iostat
Device             r/s   w/s  rkB/s  wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
nvme0n1          0.00  1000.00   0.00 4000.00    0.00    0.00   0.00   0.00    0.00   10.50    10.50     0.00     4.00  10.50 100.00

susanne-marchal

Membre depuis le 08/01/2025

oui `mq-deadline` est souvent le go-to pour les nvme et les gros workloads. tu peux le changer à chaud avec `echo mq-deadline | sudo tee /sys/block/nvme0n1/queue/scheduler` pour tester

francois-guillet

Membre depuis le 23/07/2019

ok je viens de le passer à `mq-deadline`. je relance mes tests de charge. déjà en lecture ça semble un peu plus réactif. je vais laisser tourner pour voir si les pics d'écriture s'améliorent

oceane-lebon

Membre depuis le 21/07/2024

l'idée derrière `mq-deadline` c'est qu'il est bien adapté pour les nvme qui ont déjà une très faible latence intrinsèque et gèrent leurs propres files d'attente. il se concentre sur la prévention de la famine d'i/o et le respect des délais pour les requêtes. pour postgres qui fait beaucoup d'écritures sync et de fsync c'est souvent un bon match

francois-guillet

Membre depuis le 23/07/2019

putain c'est le jour et la nuit ! les lags ont presque disparu je vois beaucoup moins de `w_await` sur iostat. c'est beaucoup plus stable même sous forte charge. impressionnant merci pour le tip

maillet-elodie

Membre depuis le 21/07/2024

super ! n'oublie pas de rendre le changement persistant via grub ou udev rules sinon ça va revenir à `none` après un reboot. par ex tu peux ajouter `elevator=mq-deadline` dans les cmdline du kernel

francois-guillet

Membre depuis le 23/07/2019

ouaip je vais faire ça. encore merci beaucoup c'est une galère de moins

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