[Papier] [Video]
UDPDK ist ein minimaler UDP- Stack auf Basis von DPDK für schnelle Punkt-zu-Punkt-Kommunikation zwischen Servern.
Es läuft vollständig im Userspace, sodass Sie Ihre Pakete schnell verschieben können, ohne den umständlichen Kernel-Stack zu durchlaufen.
Darüber hinaus ist die Portierung bestehender Anwendungen auf UDPDK dank seiner POSIX-ähnlichen API kinderleicht! 1
Was UDPDK ist:
Was UDPDK NICHT ist:
1 Einige Funktionen werden möglicherweise noch nicht unterstützt.
Um UDPDK nutzen zu können, müssen Ihre Maschinen mit DPDK-fähigen NICs ausgestattet sein; Diese sind typischerweise in Servern zu finden, nicht in Laptops und Desktop-Computern. Die Liste der offiziell von DPDK unterstützten Hardware finden Sie hier. Konkret wurde UDPDK auf Intel X710-DA2 mit igb_uio- und vfio -Treibern entwickelt und getestet; Andere Geräte sollten funktionieren, solange DPDK sie unterstützt.
UDPDK erfordert:
Sie sind bereits als Submodule in diesem Repository enthalten, also rufen Sie sie ab:
git submodule init
git submodule update
DPDK
DPDK ist das zentrale Element von UDPDK. Es verwaltet die Netzwerkkarte und implementiert Ethernet.
cd dpdk/usertools
./dpdk-setup.sh
Gehen Sie im Menü wie folgt vor:
x86_64-native-linuxapp-gcc
vfio
-Modul
️ Wenn Sie den VFIO-Treiber verwenden , müssen Sie IOMMU in Ihrem System aktivieren.
Um es zu aktivieren, öffnen Sie/etc/default/grub
, fügen Sie das Flagintel_iommu=on
inGRUB_CMDLINE_LINUX_DEFAULT
hinzu,sudo update-grub
und starten Sie schließlich neu.
inih
inih wird zur Vereinfachung des Parsens .ini
Konfigurationsdateien verwendet.
cd inih
meson build
cd build
ninja
UDPDK wird in eine statische Bibliothek integriert, die schließlich mit der endgültigen Anwendung verknüpft werden muss.
cd udpdk
make
sudo make install
Die API von UDPDK ähnelt stark der der guten alten BSD-Sockets:
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);
Darüber hinaus sind für den ordnungsgemäßen Auf- und Abbau der DPDK-Interna (Strukturen und Prozesse) die folgenden Methoden erforderlich:
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
Hinweis: select() ist noch nicht implementiert
Der Ordner apps/
enthält zwei einfache Beispiele: eine Ping-Pong- und eine PKT-Gen-Anwendung.
UDPDK läuft in zwei separaten Prozessen: Der primäre Prozess enthält die Anwendungslogik (d. h. dort, wo Systemaufrufe aufgerufen werden), während der sekundäre Prozess ( Poller ) die Netzwerkkarte kontinuierlich abfragt, um Daten zu senden und zu empfangen. Die Pakete werden zwischen der Anwendung und dem Poller über den gemeinsamen Speicher unter Verwendung sperrloser Ringwarteschlangen ausgetauscht.
Wir vergleichen UDPDK hinsichtlich Durchsatz und Latenz mit Standard-UDP-Sockets.
Umfeld
Zwei identische Server sind Punkt-zu-Punkt über eine 10G-Schnittstelle verbunden. Ihre Spezifikationen sind:
CPU: Intel Xeon E5-2640 mit 2,4 GHz
RAM: 64 GB
Betriebssystem: Ubuntu 18.04
Kernel: 4.15.0
Netzwerkkarte: Intel X710 DA2 10GbE
NIC-Treiber: VFIO (DPDK) oder i40e (normale Sockel)
Durchsatz
Wir messen den maximal erreichten Durchsatz anhand der Paketgröße.
Letzteres umfasst die UDP-, IP- und MAC-Header.
Wie im Bild gezeigt, ist UDPDK bis zu 18x besser als herkömmliche Sockets.
Es ist zu beachten, dass UDPDK die 10G-Verbindung überlastet, was leider alles ist, was wir hatten: Eine 40G-Schnittstelle würde es auf jeden Fall glänzen lassen!
Latenz
Wir messen die Latenz und deren Jitter.
Auch hier erweist sich UDPDK als um eine Größenordnung besser als Standard-Sockets.
UDPDK | Standard | |
---|---|---|
Mittelwert (μs) | 13.92 | 116,57 |
Standard (μs) | 0,74 | 18.49 |
Der Code von UDPDK wird unter der BSD 3-Clause-Lizenz veröffentlicht.
Diese Arbeit wurde auf der IEEE NFV-SDN 2021, der 7. IEEE-Konferenz über Netzwerkfunktionsvirtualisierung und Software-Defined Networking, vorgestellt. Die Autoren sind: L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi.
Lai, Leonardo et al. „NFV-Dienste mit extrem geringer Latenz mithilfe von DPDK“ 2021 IEEE-Konferenz über Netzwerkfunktionsvirtualisierung und softwaredefinierte Netzwerke (NFV-SDN). IEEE, 2021.
Jeder ist herzlich willkommen, einen Beitrag zu UDPDK zu leisten, indem er neue Funktionen implementiert, bestehende erweitert oder einfach Fehler/Probleme meldet.