Une nouvelle technologie d'appel système asynchrone pour les Entrées/Sorties

le 2 mars 2022, par Barnabé Geffroy et Bruno Thomas - 3 min de lecture

Décryptage Avancé io_uring epoll rust backend

Alors que la plupart des serveurs sous Linux utilisent le service epoll pour gérer les E/S asynchrones, une nouvelle technologie est en train d’émerger et promet de se développer dans les années à venir : io_uring.

Fonctionnement

Développé par Jens Axboe depuis 2019, io_uring utilise une logique différente d’epoll pour éviter les copies de blocs mémoires dans le traitement des E/S.

Le fonctionnement basique est le suivant :

Image : Schéma explicatif du fonctionnement de io_uring

  1. un appel système asynchrone pour lire un fichier est fait par un programme (par exemple en python) ;
  2. la configuration/présence de la librairie io_uring dans le système fait que l’interpréteur/compilateur va utiliser la librairie io_uring ;
  3. l’instruction de lecture (await open(file)) via liburing/io_uring va mettre l’instruction readv dans une Submission Queue Entry (SQE). Cette structure de données va elle-même être mise en file dans la Submission Queue ;
  4. l’appel système io_uring_enter indique au kernel une nouvelle entrée, ou bien le kernel va scruter la queue (en mode poll) ;
  5. le système exécute l’instruction readv et place une structure Completion Queue Entry contentant le résultat du readv dans la Completion Queue ;
  6. le await readv est résolu et renvoie le résultat au programme.

Ce fonctionnement est détaillé dans cet article avec le code en C.

L’objectif est :

  1. de grouper les instructions relatives à un descripteur de fichier avant de déclencher io_uring_enter (ou le système va le faire en mode polling)
  2. d’éviter les copies de structures en partageant ces 2 buffers circulaires (Submission Queue/Completion Queue) entre le user space et le kernel space.

Efficacité

De nombreux benchmarks donnent des résultats impressionnants de io_uring par rapport à epoll. Comme dans ce tweet :

Dans ce benchmark, io_uring est 45% plus efficace avec un echo server TCP/IP. Comme les serveurs HTTP sont basés sur des sockets TCP/IP, on peut espérer des gains de performance significatifs.

Depuis ce tweet du 19 janvier 2020, les performances ont été encore améliorées :

passant de 3,4M IOPS (Input/Ouput Operations Per Second) sur un processeur, un coeur à 3,8M IOPS. Puis après avoir changé pour un processeur Ryzen 9 5950X, il a amélioré à 5.5M IOPS puis 6.1M IOPS et enfin 9M IOPS (toujours sur un proc/core):

Intégration dans le service d’Iroco ?

io_uring semble être une technologie prometteuse et beaucoup plus sobre. L’intégrer dans notre service serait alors un moyen d’en réduire davantage l’empreinte énergétique. C’est encore un modèle à éprouver dans des situations de production.

L’intégration de io_uring dans les serveurs mail dovecot/cyrus/postfix pourrait sans doute apporter des améliorations importantes de performance étant donné le nombre d’entrées sorties qui sont effectuées par ces serveurs. Les services auraient alors une empreinte énergétique encore plus faible.

Par suite, on peut aussi s’intéresser aux autres serveurs, comme les serveurs de persistence. Par exemple, les développeurs de Postgresql (la base de données d’Iroco) s’intéressent également à une implémentation du serveur qui utiliserait io_uring.

Nous suivons avec attention ces évolutions et nous essayerons aussi d’y participer.

Quelques publications de référence sur le numérique responsable

le 24 novembre 2021, par Adeline Agut - 1 min de lecture

Décryptage Grand public littérature

Le sujet du numérique responsable a pris de l’ampleur depuis quelques années et les publications qui en abordent l’un ou l’autre des aspects se multiplient. Si le sujet vous intéresse mais que vous ne savez pas par où commencer, voici quelques suggestions de lecture qui vous permettront d’entrer progressivement dans le bain :

  • La synthèse de l’étude de GreenIT.fr sur l’empreinte environnementale du numérique mondial condense en une dizaine de pages accessibles l’essentiel des informations sur les impacts du secteur numérique, sur son évolution plausible d’ici 2025 et sur les bonnes pratiques à adopter pour limiter son impact.
  • Le résumé pour les décideurs du rapport “Déployer la sobriété numérique” du Shift Project résume en quelques pages les grands enjeux du numérique responsable : évaluer la pertinence de la digitalisation, maîtriser les usages du numérique, penser et déployer la sobriété. Si le sujet vous passionne, rien ne vous empêche de lire l’intégralité du rapport.
  • Pour un regard un peu plus interdisciplinaire sur le numérique et les usages que nous en faisons, nous vous conseillons les publications de Gauthier Roussilhe. Pourquoi ne pas commencer par Situer le numérique, qui introduit et met en perspective avec pédagogie les enjeux environnementaux du numérique ?

Benchmark vuejs vs. svelte (3/3)

le 20 octobre 2021, par Bruno Thomas - 3 min de lecture

Sous le capot Avancé svelte vuejs greenIT frontend benchmark

Lors de la présentation de nos résultats sur le benchmark vuejs/react au groupe de travail Boavizta, nous avons eu ces retours parmi d’autres :

Benchmark vuejs vs. reactjs (2/3)

le 12 octobre 2021, par Bruno Thomas - 4 min de lecture

Sous le capot Avancé reactjs vuejs greenIT frontend benchmark

Résumé de l’épisode précédent : nous avons fait deux applications identiques (une en reactjs et l’autre en vuejs) avec les fonctionnalités suivantes :

Migration vers une technologie front plus responsable. (1/3)

le 5 octobre 2021, par Bruno Thomas - 2 min de lecture

Sous le capot Avancé svelte reactjs vuejs greenIT frontend benchmark

Nous avons fait une mini série de 3 posts sur des benchmarks de technologie backend afin de tester notre architecture. Nous allons explorer dans une nouvelle série la partie frontend avec des frameworks web javascript/typescript : vuejs, reactjs et svelte.