io_uring pas perf du tout pour gros iops c'est quoi le trick

Posté par alain-ollivier le 15/06/2025
RÉSOLU

alain-ollivier

Membre depuis le 08/05/2020

actif

salut à tous on essaie de tirer le max de nos nvme pour une db custom et on a migré notre moteur i/o sur io_uring mais on voit pas les gains de perf escomptés c'est même parfois pire qu'avec libaio. on pousse des millions de petites écritures aléatoires c'est sur un kernel 5.15

// extrait du code de setup io_uringstruct io_uring_params p;memset(&p, 0, sizeof(p));p.flags = IORING_SETUP_SQPOLL;p.sq_thread_cpu = 0; // tenter de pinner le thread sqint ring_fd = io_uring_setup(depth, &p);if (ring_fd < 0) {    perror("io_uring_setup");    return 1;}io_uring_queue_init_params(depth, &ring, &p);

Commentaires

lroux

Membre depuis le 12/10/2024

actif secouriste

pour des petites écritures aléatoires IORING_SETUP_SQPOLL c'est bien mais t'as tuné les paramètres du SQ thread ? genre le temps qu'il reste actif avant de dormir

alain-ollivier

Membre depuis le 08/05/2020

actif

j'ai laissé les valeurs par défaut pour l'instant

lroux

Membre depuis le 12/10/2024

actif secouriste

cherche io_uring_register_ring_fd ou regarde les sysctls associés t'as sq_thread_idle et sq_thread_lap t'as besoin de les baisser pour la latence des petits i/o

alain-ollivier

Membre depuis le 08/05/2020

actif

ah je vois en gros le thread poll s'endort trop vite c'est ça ?

lroux

Membre depuis le 12/10/2024

actif secouriste

exactement pour de petites I/O à haute fréquence tu veux qu'il soit hyper réactif. le cpu c'est pas le problème là c'est le réveil du thread

lroux

Membre depuis le 12/10/2024

actif secouriste

t'as regardé les métriques io_uring via bpftrace ou perf ? ça peut te donner des indices sur où le temps est passé

alain-ollivier

Membre depuis le 08/05/2020

actif

non pas encore bpftrace j'ai juste perf pour le moment j'ai vu des context switches pas mal

lroux

Membre depuis le 12/10/2024

actif secouriste

les context switches c'est le symptôme le sq_thread_idle qui est trop haut ou pas assez d'événements pour le maintenir actif

lroux

Membre depuis le 12/10/2024

actif secouriste

essaie de jouer avec ioring_setup_iopoll aussi si tes devices supportent les async notify pour compléter les cqs sans polling actif par le cpu

alain-ollivier

Membre depuis le 08/05/2020

actif

iopoll ça demande que le device soit en mode polling aussi non ? mes nvme sont pas tous configurés comme ça

lroux

Membre depuis le 12/10/2024

actif secouriste

oui c'est ça il faut un kernel patché ou un driver qui gère le polling direct mais c'est pas toujours nécessaire déjà sqpoll c'est un bon début

alain-ollivier

Membre depuis le 08/05/2020

actif

je vais baisser les idle times du sq_thread via /proc/sys/kernel/io_uring/sq_thread_idle

lroux

Membre depuis le 12/10/2024

actif secouriste

faut le faire via io_uring_register_ring_fd pour être propre c'est plus granulaire pour ton application seulement

alain-ollivier

Membre depuis le 08/05/2020

actif

ok j'ai trouvé la doc pour io_uring_register_ring_fd avec IORING_REGISTER_SQ_RING_FDS pour contrôler les idle times. Je vais le coder

lroux

Membre depuis le 12/10/2024

actif secouriste

n'oublie pas le IORING_REGISTER_SQ_RING_FDS c'est pour enregistrer des fds supplémentaires c'est IORING_REGISTER_RING_FDS avec IORING_RING_OP_SET_SQ_THREAD_IDLE

alain-ollivier

Membre depuis le 08/05/2020

actif

oups merci pour la précision j'ai relu. en gros j'appelle io_uring_register pour set les params du sq_thread. ok j'implémente ça

alain-ollivier

Membre depuis le 08/05/2020

actif

incroyable ! j'ai set l'idle timeout à 0ms et le lap à 1ms et le throughput a fait x3 en lectures et x2 en écritures. et les context switches ont quasi disparu

lroux

Membre depuis le 12/10/2024

actif secouriste

nickel c'est l'optimisation classique pour io_uring quand tu fais du high-perf low-latency i/o c'est pas intuitif au début

alain-ollivier

Membre depuis le 08/05/2020

actif

carrément j'aurais jamais pensé à aller dans ces tréfonds sans aide thx pour le coup de main

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