Accueil Astuces et Informations libuv, une bibliothèque multiplateforme utilisée dans de nombreux projets pour la prise...

libuv, une bibliothèque multiplateforme utilisée dans de nombreux projets pour la prise en charge des E/S

2
0
libuv

libuv est une bibliothèque de support multiplateforme axée sur les E/S asynchrones.

Il est récemment devenu connu la sortie de la nouvelle version de la bibliothèque libuv 1.45.0, qui est largement utilisé pour le multiplexage des connexions et le traitement des E/S asynchrones dans de nombreux projets visant le traitement haute performance des requêtes de fichiers et de réseau, par exemple sur la plate-forme Node.js, BIND 9 et Knot.

Pour ceux qui ne connaissent pas libuv, ils doivent savoir que cela est une bibliothèque C multiplateforme qui prend en charge les E/S asynchrones basées sur des boucles d’événements. Il prend en charge epoll Windows kqueue IOCP, les ports d’événements Solaris et sous Linux, c’est l’une des bibliothèques qui prend en charge io_uring.

À propos de libuv

libuv est principalement conçu pour être utilisé dans Node.js, mais il est également utilisé par d’autres projets logiciels. C’était à l’origine une abstraction autour de libev ou de Microsoft IOCP, car libev ne prend pas en charge IOCP sous Windows.

La bibliothèque permet d’organiser une boucle non bloquante d’événements en utilisant des méthodes comme epoll sur Linux, kqueue sur BSD et macOS, IOCP sur Windows et les ports d’événements sur Solaris

Des caractéristiques exceptionnelles de libuv :

  • Boucle d’événements complète prise en charge par epoll, kqueue, IOCP, ports d’événements
  • Sockets TCP et UDP asynchrones
  • Résolution DNS asynchrone
  • Opérations asynchrones de fichiers et de systèmes de fichiers
  • Événements du système de fichiers
  • Code d’échappement ANSI contrôlé par TTY
  • IPC avec partage de socket, utilisant des sockets de domaine Unix ou des canaux nommés (Windows)
  • Processus secondaires
  • pool de threads
  • traitement du signal
  • horloge haute résolution
  • Threading et primitives de synchronisation

Des fonctionnalités multiplateformes sont disponibles pour que les applications fonctionnent avec les connexions réseau TCP et UDP en mode asynchrone, la résolution DNS asynchrone, le travail asynchrone avec les fichiers, le suivi des événements du système de fichiers, l’organisation IPC pour le partage de sockets, l’organisation d’un pool de threads le traitement du signal et l’utilisation de minuteries de haute précision.

La bibliothèque inclut également des primitives pour organiser l’exécution multithread et la synchronisation des threads. En plus de la boucle d’événements, deux primitives de base abstraites de haut niveau sont utilisées : les « gestionnaires » pour implémenter des objets à longue durée de vie qui effectuent plusieurs opérations, et les « requêtes » pour effectuer des demandes de courte durée.

Principales nouveautés de libuv 1.45

Une amélioration clé dans la nouvelle version est la mise en œuvre du support tant attendu de l’interface d’E/S asynchrones io_uring fourni par le noyau Linux depuis la version 5.1.

En plus de cela, il met également en évidence la prise en charge de l’interrogation des E/S et possibilité de travailler avec et sans mise en mémoire tampon Avec l’API io_uring, les développeurs du noyau ont tenté de combler les lacunes de l’ancienne interface aio. En termes de performances, io_uring est très proche de SPDK et surpasse nettement libaio lorsque le polling est activé.

en libuv, l’interface io_uring peut être utilisée sur les plates-formes Linux avec le noyau 5.1+ dans les primitives de manipulation de fichiers asynchrones tels que lecture, écriture, fsync, fdatasync, stat, fstat et lstat. Sur d’autres systèmes d’exploitation et systèmes avec des noyaux plus anciens, le pool de threads est toujours utilisé.

Il est mentionné que des tests de performances ont montré que l’utilisation de io_uring dans libuv peut atteindre une augmentation de performances de 8 fois. Le travail d’ajout de io_uring à libuv a été soutenu par l’ISC (Internet Systems Consortium), qui utilise la bibliothèque en question sur le serveur DNS BIND.

D’autres améliorations dans la nouvelle version incluent le définition d’une seule taille de tas de 8 Mo pour le pool de threads sur toutes les architectures et plateformes.

Il est également souligné que ajout d’une nouvelle API uv_metrics_info() pour collecter des métriques, tels que le nombre d’itérations dans la boucle d’événements, le nombre total d’événements traités et le nombre d’événements en attente dans la file d’attente au moment où la demande a été envoyée.

Finalement, Si vous souhaitez en savoir plus, il faut savoir que le code du projet est écrit en C et est distribué sous licence MIT. Vous pouvez vérifier les détails dans le lien suivant.