[Papier] [Vidéo]
UDPDK est une pile UDP minimale basée sur DPDK pour une communication point à point rapide entre les serveurs.
Il s'exécute entièrement dans l'espace utilisateur, afin que vous puissiez déplacer vos paquets rapidement sans passer par la lourde pile du noyau.
De plus, grâce à son API de type POSIX, le portage d'applications existantes vers UDPDK est très simple ! 1
Qu'est-ce qu'UDPDK :
Ce que UDPDK n'est PAS :
1 Certaines fonctionnalités peuvent ne pas encore être prises en charge.
Pour utiliser UDPDK, vos machines doivent être équipées de cartes réseau compatibles DPDK ; ceux-ci se trouvent généralement dans les serveurs, et non dans les ordinateurs portables et les ordinateurs de bureau. La liste du matériel officiellement pris en charge par DPDK est disponible ici. Plus précisément, UDPDK a été développé et testé sur Intel X710-DA2 avec les pilotes igb_uio et vfio ; les autres appareils devraient fonctionner tant que DPDK les prend en charge.
UDPDK nécessite :
Ils sont déjà inclus dans ce référentiel en tant que sous-modules, alors extrayez-les :
git submodule init
git submodule update
DPDK
DPDK est l'élément central d'UDPDK. Il gère la carte réseau et implémente Ethernet.
cd dpdk/usertools
./dpdk-setup.sh
Dans le menu, procédez comme suit :
x86_64-native-linuxapp-gcc
vfio
️ Si vous utilisez le pilote VFIO , vous devez alors activer l'IOMMU sur votre système.
Pour l'activer, ouvrez/etc/default/grub
, ajoutez le flagintel_iommu=on
dansGRUB_CMDLINE_LINUX_DEFAULT
, puissudo update-grub
et enfin redémarrez.
inih
inih est utilisé pour plus de commodité pour analyser les fichiers de configuration .ini
.
cd inih
meson build
cd build
ninja
UDPDK s'intègre dans une bibliothèque statique, qui doit éventuellement être liée à l'application finale.
cd udpdk
make
sudo make install
L’API d’UDPDK ressemble beaucoup à celle des bons vieux sockets BSD :
int udpdk_socket(int domain, int type, int protocol);
int udpdk_bind(int s, const struct sockaddr *addr, socklen_t addrlen);
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t *optlen);
ssize_t udpdk_sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t udpdk_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
int udpdk_close(int s);
De plus, les méthodes suivantes sont requises pour la configuration et le démontage appropriés des éléments internes du DPDK (structures et processus) :
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
Remarque : select() n'est pas encore implémenté
Le dossier apps/
contient deux exemples simples : une application ping-pong et une application pkt-gen.
UDPDK s'exécute en deux processus distincts : le principal est celui contenant la logique de l'application (c'est-à-dire là où les appels système sont appelés), tandis que le secondaire ( poller ) interroge en permanence la carte réseau pour envoyer et recevoir des données. Les paquets sont échangés entre l'application et l'interrogateur via la mémoire partagée, à l'aide de files d'attente en anneau sans verrouillage.
Nous comparons UDPDK aux sockets UDP standard en termes de débit et de latence.
Environnement
Deux serveurs identiques sont connectés point à point sur une interface 10G. Leurs spécifications sont :
Processeur : Intel Xeon E5-2640 à 2,4 GHz
RAM : 64 Go
Système d'exploitation : Ubuntu 18.04
Noyau : 4.15.0
Carte réseau : Intel X710 DA2 10GbE
Pilote NIC : VFIO (DPDK) ou i40e (sockets normaux)
Débit
Nous mesurons le débit maximum atteint en faisant varier la taille du paquet.
Ce dernier inclut les en-têtes UDP, IP et MAC.
Comme le montre l'image, UDPDK est jusqu'à 18 fois meilleur que les sockets traditionnels.
A noter que l'UDPDK sature la connexion 10G, ce qui est malheureusement tout ce que nous avions : une interface 40G la ferait définitivement briller !
Latence
Nous mesurons la latence et sa gigue.
Encore une fois, UDPDK s'avère être un ordre de grandeur meilleur que les sockets standard.
UDPDK | Standard | |
---|---|---|
Moyenne (μs) | 13.92 | 116,57 |
Norme (μs) | 0,74 | 18h49 |
Le code de UDPDK est publié sous licence BSD 3-Clause.
Ce travail a été présenté à l'IEEE NFV-SDN 2021, la 7e conférence de l'IEEE sur la virtualisation des fonctions réseau et les réseaux définis par logiciel. Les auteurs sont : L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi.
Lai, Leonardo et coll. « Services NFV à latence ultra-faible utilisant DPDK » Conférence IEEE 2021 sur la virtualisation des fonctions réseau et les réseaux définis par logiciel (NFV-SDN). IEEE, 2021.
Tout le monde est plus que bienvenu pour contribuer à UDPDK en implémentant de nouvelles fonctionnalités, en étendant celles existantes ou simplement en signalant des bogues/problèmes.