[Artigo] [Vídeo]
UDPDK é uma pilha UDP mínima baseada em DPDK para comunicação rápida ponto a ponto entre servidores.
Ele é executado completamente no espaço do usuário, para que você possa mover seus pacotes rapidamente sem passar pela complicada pilha do kernel.
Além disso, graças à sua API semelhante ao POSIX, portar aplicativos existentes para UDPDK é extremamente fácil! 1
O que é UDPDK:
O que UDPDK NÃO é:
1 Alguns recursos ainda podem não ser suportados.
Para usar o UDPDK, suas máquinas devem estar equipadas com NICs habilitadas para DPDK; eles são normalmente encontrados em servidores, não em laptops e desktops. A lista de hardware oficialmente suportado pelo DPDK está disponível aqui. Especificamente, o UDPDK foi desenvolvido e testado no Intel X710-DA2 com drivers igb_uio e vfio ; outros dispositivos devem funcionar desde que o DPDK os suporte.
O UDPDK requer:
Eles já estão incluídos neste repositório como submódulos, então extraia-os:
git submodule init
git submodule update
DPDK
DPDK é o elemento central do UDPDK. Ele gerencia a NIC e implementa Ethernet.
cd dpdk/usertools
./dpdk-setup.sh
No menu, faça o seguinte:
x86_64-native-linuxapp-gcc
vfio
️ Se você usar o driver VFIO , deverá habilitar o IOMMU em seu sistema.
Para habilitá-lo, abra/etc/default/grub
, adicione o sinalizadorintel_iommu=on
emGRUB_CMDLINE_LINUX_DEFAULT
, entãosudo update-grub
e finalmente reinicie.
inih
inih é usado por conveniência para analisar arquivos de configuração .ini
.
cd inih
meson build
cd build
ninja
O UDPDK é construído em uma biblioteca estática, que eventualmente precisa ser vinculada ao aplicativo final.
cd udpdk
make
sudo make install
A API do UDPDK se assemelha muito à dos bons e velhos soquetes 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);
Além disso, os seguintes métodos são necessários para a configuração e desmontagem adequadas dos componentes internos do DPDK (estruturas e processos):
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
Nota: select() ainda não está implementado
A pasta apps/
contém dois exemplos simples: um aplicativo ping-pong e um aplicativo pkt-gen.
O UDPDK é executado em dois processos separados: o primário é aquele que contém a lógica da aplicação (ou seja, onde as syscalls são chamadas), enquanto o secundário ( poller ) sonda continuamente a NIC para enviar e receber dados. Os pacotes são trocados entre o aplicativo e o poller por meio de memória compartilhada, usando filas em anel sem bloqueio.
Comparamos o UDPDK com os soquetes UDP padrão em termos de taxa de transferência e latência.
Ambiente
Dois servidores idênticos estão conectados ponto a ponto em uma interface 10G. Suas especificações são:
Processador: Intel Xeon E5-2640 a 2,4 GHz
RAM: 64 GB
SO: Ubuntu 18.04
Núcleo: 4.15.0
Placa de rede: Intel X710 DA2 10GbE
Driver NIC: VFIO (DPDK) ou i40e (soquetes normais)
Taxa de transferência
Medimos o rendimento máximo alcançado variando o tamanho do pacote.
Este último inclui os cabeçalhos UDP, IP e MAC.
Conforme mostrado na imagem, o UDPDK é até 18x melhor que os soquetes tradicionais.
Deve-se notar que o UDPDK satura a conexão 10G, que infelizmente é tudo o que tínhamos: uma interface 40G definitivamente a faria brilhar!
Latência
Medimos a latência e seu jitter.
Novamente, o UDPDK prova ser uma ordem de magnitude melhor que os soquetes padrão.
UDPDK | Padrão | |
---|---|---|
Média (μs) | 13,92 | 116,57 |
Padrão (μs) | 0,74 | 18h49 |
O código do UDPDK é lançado sob a licença BSD de 3 cláusulas.
Este trabalho foi apresentado na IEEE NFV-SDN 2021, a 7ª Conferência IEEE sobre Virtualização de Funções de Rede e Redes Definidas por Software. Os autores são: L. Lai, G. Ara, T. Cucinotta, K. Kondepu, L. Valcarenghi.
Lai, Leonardo, et al. "Serviços NFV de latência ultrabaixa usando DPDK" Conferência IEEE 2021 sobre virtualização de funções de rede e redes definidas por software (NFV-SDN). IEEE, 2021.
Todos são mais que bem-vindos para contribuir com o UDPDK implementando novos recursos, estendendo os existentes ou simplesmente relatando bugs/problemas.