[论文] [视频]
UDPDK是基于DPDK的最小UDP堆栈,用于服务器之间的快速点对点通信。
它完全在用户空间中运行,因此您可以快速移动数据包,而无需通过繁琐的内核堆栈。
此外,由于其类似 POSIX 的 API,将现有应用程序移植到 UDPDK 非常容易! 1
什么是UDPDK:
UDPDK 不是什么:
1某些功能可能尚不支持。
为了使用UDPDK,您的机器必须配备支持DPDK的网卡;这些通常存在于服务器中,而不是笔记本电脑和台式机中。 DPDK 官方支持的硬件列表可在此处获取。具体来说,UDPDK已经在Intel X710-DA2上使用igb_uio和vfio驱动程序进行了开发和测试;只要 DPDK 支持,其他设备就应该可以工作。
UDPDK 需要:
它们已经作为子模块包含在此存储库中,因此请拉取它们:
git submodule init
git submodule update
DPDK
DPDK是UDPDK的关键要素。它管理 NIC 并实现以太网。
cd dpdk/usertools
./dpdk-setup.sh
从菜单中执行以下操作:
x86_64-native-linuxapp-gcc
vfio
模块
️ 如果您使用 VFIO 驱动程序,则必须在系统中启用 IOMMU。
要启用它,请打开/etc/default/grub
,在GRUB_CMDLINE_LINUX_DEFAULT
中添加标志intel_iommu=on
,然后sudo update-grub
最后重新启动。
伊尼赫
inih 用于方便解析.ini
配置文件。
cd inih
meson build
cd build
ninja
UDPDK构建成静态库,最终需要与最终应用程序链接。
cd udpdk
make
sudo make install
UDPDK 的 API 与老式 BSD 套接字的 API 非常相似:
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);
此外,正确设置和拆卸 DPDK 内部结构(结构和流程)需要以下方法:
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
注意: select() 尚未实现
apps/
文件夹包含两个简单的示例:一个 ping-pong 和一个 pkt-gen 应用程序。
UDPDK 在两个独立的进程中运行:主进程包含应用程序逻辑(即调用系统调用的进程),而辅助进程(轮询器)持续轮询 NIC 以发送和接收数据。使用无锁环形队列,通过共享内存在应用程序和轮询器之间交换数据包。
我们将 UDPDK 与标准 UDP 套接字在吞吐量和延迟方面进行比较。
环境
两台相同的服务器在 10G 接口上点对点连接。他们的规格是:
CPU:英特尔至强 E5-2640 @2.4GHz
内存: 64GB
操作系统: Ubuntu 18.04
内核: 4.15.0
网卡: Intel X710 DA2 10GbE
网卡驱动: VFIO(DPDK)或i40e(普通插座)
吞吐量
我们测量不同数据包大小所实现的最大吞吐量。
后者包括 UDP、IP 和 MAC 标头。
如图所示,UDPDK 比传统套接字性能提高了 18 倍。
应该指出的是,UDPDK 使 10G 连接饱和,不幸的是,这就是我们所拥有的一切:40G 接口将使它绝对闪耀!
延迟
我们测量延迟及其抖动。
UDPDK 再次被证明比标准套接字好一个数量级。
UDP开发工具包 | 标准 | |
---|---|---|
平均值(μs) | 13.92 | 116.57 |
标准(μs) | 0.74 | 18.49 |
UDPDK的代码是在BSD 3-Clause许可证下发布的。
这项工作已在 IEEE NFV-SDN 2021(第七届 IEEE 网络功能虚拟化和软件定义网络会议)上进行了展示。作者是:L. Lai、G. Ara、T. Cucinotta、K. Kondepu、L. Valcarenghi。
赖,莱昂纳多,等人。 “使用 DPDK 的超低延迟 NFV 服务”2021 年 IEEE 网络功能虚拟化和软件定义网络 (NFV-SDN) 会议。 IEEE,2021。
我们非常欢迎每个人通过实施新功能、扩展现有功能或只是报告错误/问题来为 UDPDK 做出贡献。