Perf écriture PostgreSQL catastrophique avec io_uring sur nvme

gallet-laurence 25/07/2025
RÉSOLU
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

Salut à tous. On a migré nos bases pgsql sur des NVMe en utilisant io_uring via un custom build de pg. on s'attendait à des perfs de malade mais au lieu de ça les writes sont ultra lents les fsync prennent des plombes. j'ai un doute sur la config kernel ou io_uring

-- query qui rame
INSERT INTO huge_table (data) VALUES (...);
-- explication
-- ça fait des batchs de 10k inserts et ça prend 20s au lieu de 2s avant

uname -a: Linux myhost 5.15.0-xx-generic #yy-Ubuntu SMP ... x86_64 x86_64 x86_64 GNU/Linux

25/07/2025 à 15:21

17 commentaires

noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

io_uring c'est super complexe déjà quel type de submition tu utilises IORING_SETUP_SQPOLL ou le mode plus simple

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

on est en IORING_SETUP_SQPOLL c'est censé être le plus perf j'ai vérifié le code de pg le pooler kernel thread est actif

Modifié le 23/05/2026 à 16:20
noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

ok et quel scheduler i/o est actif sur tes nvme cat /sys/block/nvme0n1/queue/scheduler normalement c'est none pour nvme si t'es sur un kernel récent

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

c'est bien none déjà vérifié mais j'ai un doute sur le nr_requests combien de requêtes tu laisses en vol pour les async i/o

Modifié le 23/05/2026 à 16:20
fherve
Membre Actif Secouriste
Avatar de fherve
fherve
Membre Actif Secouriste

pour pgsql des fois c'est pas juste l'io_uring mais ta config pgsql le wal_sync_method par exemple si tu forces fsync ou fdatasync et full_page_writes est à on

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

oui wal_sync_method = fdatasync et full_page_writes = on c le setup classique pour la durabilité. on peut pas y toucher

Modifié le 23/05/2026 à 16:20
noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

c'est normal fdatasync et full_page_writes c'est pour la sécurité. par contre io_uring avec fdatasync peut être contre-productif si t'as pas une bonne queue depth. et les nvme sont pas tous égaux

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

on a des samsung pcie gen4. je suis à 128 pour nr_requests pour l'instant je vais essayer de monter ça

Modifié le 23/05/2026 à 16:20
noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

128 c'est déjà pas mal. t'as vérifié les io_uring_stats du kernel? cat /proc/sys/fs/io_uring/pids tu peux voir les stats globales et par process

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

non pas encore j'avoue je savais même pas pour ce fichier. je vais regarder ça

03/08/2025 à 04:29
fherve
Membre Actif Secouriste
Avatar de fherve
fherve
Membre Actif Secouriste

et n'oublie pas vm.dirty_background_ratio et vm.dirty_ratio si tu as trop de dirty pages en RAM et que le kernel doit les flush d'un coup ça peut bloquer ton i/o même si c'est du nvme

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

bonne piste pour les dirty pages. on a 256GB de RAM sur le serveur et les ratios sont à 10%/20% donc 25GB de dirty pages ça peut être énorme

05/08/2025 à 01:56
noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

exact pour les dirty pages. si tu as une charge d'écriture constante et que ton kernel flush tout d'un coup tu vas voir des spikes de latence. essaie de les baisser par exemple à 2% et 5%

05/08/2025 à 21:39
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

ok j'ai mis vm.dirty_background_ratio = 2 et vm.dirty_ratio = 5. les écritures sont un peu mieux mais toujours pas le gain espéré avec io_uring

Modifié le 23/05/2026 à 16:20
noemi38
Membre Actif
Avatar de noemi38
noemi38
Membre Actif

io_uring est pas toujours un gain pour des workloads avec beaucoup de fsync ou fdatasync si tu fais beaucoup de petites écritures aléatoires O_DIRECT peut être plus simple ou même l'approche classique mmap. et pour pgsql la taille des WAL segments ça joue aussi

Modifié le 23/05/2026 à 16:20
fherve
Membre Actif Secouriste
Avatar de fherve
fherve
Membre Actif Secouriste

totalement. et si io_uring est pas compilé avec les bonnes options ou si le kernel a un bug avec ta version de pg. faut aussi regarder les waits dans pg stat_activity wait_event_type: IO et wait_event: wal_sync

Modifié le 23/05/2026 à 16:20
gallet-laurence
Auteur Actif
Avatar de gallet-laurence
gallet-laurence
Auteur Actif

ok on va revoir la strat. je pense qu'on va revenir à un pgsql vanilla et voir les perf avec le fdatasync normal. le gain io_uring est peut être pas pour notre workload ou alors c'est trop de tweaking kernel. merci pour toutes les idées c'était super utile

Modifié le 23/05/2026 à 16:20

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