[Papel] [Vídeo]
UDPDK es una pila UDP mínima basada en DPDK para una comunicación rápida punto a punto entre servidores.
Se ejecuta completamente en el espacio de usuario, por lo que puede mover sus paquetes rápidamente sin tener que pasar por la engorrosa pila del kernel.
Además, gracias a su API similar a POSIX, ¡portar aplicaciones existentes a UDPDK es muy fácil! 1
Qué es UDPDK:
Lo que NO es UDPDK:
1 Es posible que algunas funciones aún no sean compatibles.
Para utilizar UDPDK, sus máquinas deben estar equipadas con NIC habilitadas para DPDK; Por lo general, se encuentran en servidores, no en computadoras portátiles y de escritorio. La lista de hardware oficialmente compatible con DPDK está disponible aquí. En concreto, UDPDK ha sido desarrollado y probado en Intel X710-DA2 con controladores igb_uio y vfio ; otros dispositivos deberían funcionar siempre que DPDK los admita.
UDPDK requiere:
Ya están incluidos en este repositorio como submódulos, así que extraigalos:
git submodule init
git submodule update
DPDK
DPDK es el elemento fundamental de UDPDK. Gestiona la NIC e implementa Ethernet.
cd dpdk/usertools
./dpdk-setup.sh
Desde el menú, haga lo siguiente:
x86_64-native-linuxapp-gcc
vfio
️ Si utiliza el controlador VFIO , debe habilitar IOMMU en su sistema.
Para habilitarlo, abra/etc/default/grub
, agregue la banderaintel_iommu=on
enGRUB_CMDLINE_LINUX_DEFAULT
, luegosudo update-grub
y finalmente reinicie.
inih
inih se utiliza por conveniencia para analizar archivos de configuración .ini
.
cd inih
meson build
cd build
ninja
UDPDK se integra en una biblioteca estática, que eventualmente debe vincularse con la aplicación final.
cd udpdk
make
sudo make install
La API de UDPDK se parece mucho a la de los viejos 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);
Además, se requieren los siguientes métodos para la configuración y desmontaje adecuados de los componentes internos del DPDK (estructuras y procesos):
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
Nota: select() aún no está implementado
La carpeta apps/
contiene dos ejemplos simples: una aplicación de ping-pong y una aplicación pkt-gen.
UDPDK se ejecuta en dos procesos separados: el primario es el que contiene la lógica de la aplicación (es decir, donde se llaman las llamadas al sistema), mientras que el secundario ( poller ) sondea continuamente la NIC para enviar y recibir datos. Los paquetes se intercambian entre la aplicación y el sondeador a través de la memoria compartida, utilizando colas en anillo sin bloqueo.
Comparamos UDPDK con sockets UDP estándar en términos de rendimiento y latencia.
Ambiente
Dos servidores idénticos están conectados punto a punto en una interfaz 10G. Sus especificaciones son:
Procesador: Intel Xeon E5-2640 a 2,4 GHz
RAM: 64GB
Sistema operativo: Ubuntu 18.04
Núcleo: 4.15.0
Tarjeta de red: Intel X710 DA2 10GbE
Controlador NIC: VFIO (DPDK) o i40e (enchufes normales)
Rendimiento
Medimos el rendimiento máximo conseguido variando el tamaño del paquete.
Este último incluye los encabezados UDP, IP y MAC.
Como se muestra en la imagen, UDPDK es hasta 18 veces mejor que los sockets tradicionales.
Cabe señalar que UDPDK satura la conexión 10G, que lamentablemente es la única que teníamos: ¡una interfaz de 40G la haría brillar definitivamente!
Estado latente
Medimos la latencia y su jitter.
Una vez más, UDPDK demuestra ser un orden de magnitud mejor que los enchufes estándar.
UDPDK | Estándar | |
---|---|---|
Media (μs) | 13,92 | 116,57 |
Estándar (μs) | 0,74 | 18.49 |
El código de UDPDK se publica bajo la licencia BSD de 3 cláusulas.
Este trabajo se presentó en IEEE NFV-SDN 2021, la séptima Conferencia IEEE sobre virtualización de funciones de red y redes definidas por software. Los autores son: L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi.
Lai, Leonardo, et al. "Servicios NFV de latencia ultrabaja utilizando DPDK" Conferencia IEEE 2021 sobre virtualización de funciones de red y redes definidas por software (NFV-SDN). IEEE, 2021.
Todos son más que bienvenidos a contribuir a UDPDK implementando nuevas funciones, ampliando las existentes o simplemente informando errores/problemas.