postgresql lent avec io_uring sur nouveau kernel

emilie-francois 05/08/2025
RÉSOLU
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

Bon on vient de migrer une grosse base postgres sur un nouveau serveur avec un kernel 6.x pour profiter de io_uring. sauf que les perfs sont bof voire pires. les requêtes sont lentes les iops disque sont là mais le cpu est pas hyper chargé. j'ai l'impression que le postgres n'utilise pas bien io_uring ou qu'il y a un truc à tunner

# vérifier si io_uring est utilisé par postgres (doit être configuré à la compilation)
# show data_directory;
# cat /proc/$(pgrep -f postgres)/io | grep "rchar|wchar"
# show synchronous_commit;
05/08/2025 à 06:21

18 commentaires

henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

hello ! io_uring sur postgres c'est pas plug-and-play. il faut que postgres soit compilé avec le support. t'es sûr de ta compilation ? et surtout quel mode d'io_uring ? poll ou non ?

06/08/2025 à 03:25
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

oui compilé avec. j'ai les options qui vont bien. par défaut c'est pas du poll je crois. il faut activer IORING_SETUP_SQPOLL c'est ça ?

07/08/2025 à 00:38
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

exactement ! sans SQPOLL c'est juste un AIO amélioré. SQPOLL est crucial pour la latence. faut le configurer au niveau de l'instance d'io_uring ou par le code de postgres si c'est géré

08/08/2025 à 00:05
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

donc en gros faut que postgres ouvre son io_uring avec cette flag. mais comment je vérifie que c'est bien le cas ? et y a d'autres tunings ?

08/08/2025 à 21:05
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

pas simple de vérifier à chaud sauf à regarder les traces syscalls genre strace -e io_uring_enter mais ça va ralentir encore. si t'as le code de postgres faut voir comment c'est appelé. sinon regarde le blockdev --report pour le device sous-jacent. quel type de nvme t'as ?

09/08/2025 à 19:57
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

c'est du nvme pcie gen4. le blockdev est ok. j'ai pas vu d'options spécifiques pour io_uring dans postgres.conf

10/08/2025 à 14:14
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

non y'en a pas direct dans postgres.conf. c'est plus bas niveau. regarde aussi ta queue depth pour l'io_uring. trop faible ça bride, trop haute ça ajoute de la latence. par défaut c'est 256 je crois

11/08/2025 à 11:40
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

comment je modifie la queue depth pour postgres ? c'est pas par io_uring_setup ?

12/08/2025 à 09:32
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

oui c par l'appel io_uring_setup. si postgres gère pas ça, t'es bloqué. mais une autre piste, est-ce que tu utilises direct_io ? ça peut interagir bizarrement avec io_uring sans un bon tuning

13/08/2025 à 08:56
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

direct_io oui c'est actif. je suis en train de relire les docs kernel et postgres. il semble que postgres n'expose pas directement le tuning de io_uring comme SQPOLL

14/08/2025 à 05:41
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

c'est ça le souci. la plupart des apps n'utilisent io_uring qu'en mode "basic" sans profiter des features type sqpoll ou ioring_feat_nodrop. et si direct_io est actif assure-toi d'avoir aligné tes buffers correctement.

15/08/2025 à 02:38
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

ok donc mon souci c ptete que j'ai compilé postgres avec io_uring mais sans les features avancées qui font la diff. je suis en train de tester sans direct_io pour voir si ça change

15/08/2025 à 20:47
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

sans direct_io tu peux avoir des problèmes de double-caching avec le page cache du kernel. ça va ptete améliorer des trucs mais en rajouter d'autres. le mieux c de recompiler postgres avec un patch qui expose SQPOLL ou d'utiliser un patch existant

16/08/2025 à 19:33
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

j'ai trouvé un patch communautaire pour postgres qui expose SQPOLL et permet de tunner le ring size. je vais tenter de recompiler avec ça

17/08/2025 à 15:11
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

c'est la meilleure approche. une fois recompilé, surveille bien les métriques i/o. iostat -x et pidstat -d devraient te donner des infos sur les iodelay et la latence

18/08/2025 à 09:15
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

recompilé et déployé avec le patch. j'ai activé SQPOLL avec un ring size de 4096. les perfs sont revenues à la normale même mieux. le cpu est un peu plus sollicité pour les IO mais la latence est dingue

19/08/2025 à 06:59
henri-leroux
Membre Actif Secouriste
Avatar de henri-leroux
henri-leroux
Membre Actif Secouriste

top ! c'est le gain de SQPOLL. moins de context switch entre user et kernel space. content que ça ait marché. merci du retour

20/08/2025 à 02:32
emilie-francois
Auteur Actif
Avatar de emilie-francois
emilie-francois
Auteur Actif

ouais c'est clairement ça ! merci pour l'aide c'était super pointu comme problème sans toi j'aurais tourné en rond

20/08/2025 à 23:12

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