zMemif
zMemif是一个基于golang的本地库,用于memif与dpdk的互通,它可以简单地提供20Mpps recv和10Mpps xmit能力:
- 这个golang库是从
vpp gomemif示例代码中分叉出来的,并将 "接口 "修改为 "端口",这使得golang开发者对定义更加清晰。它还将 "主/从 "改为 "服务器/客户端",以便与现有的dpdk库保持一致。 - 我们编写了一个基于dpdk的轻量级转发器来取代数据路径上的vpp,为内核服务和基于tcp的远程管理使用提供简单的virtio-user接口,所有udp数据包将重定向到memif,可以直接由本地golang服务。
动机
许多应用程序,如网络遥测分析,视频处理和其他基于udp的应用程序可能需要在本地golang环境下的高性能I/O支持。在这种情况下,DPDK可能有助于加速数据包的处理,英特尔在几年前开放了nff-go项目,然而基于cgo和flow的抽象可能对NFV开发者有用,但许多应用开发者需要一个简单的基于本地go的解决方案:
这个项目将被用于ruta-io和netDAM。 我们可能在未来将zMemif 与go-quic 集成,以提供quic based segment routing(quic-sr) 或Segment Routing over UDP(SRoU) 。
简介
zmemif是一个用于加速golang的内存接口实现。你可以在golang模式下建立你的应用程序,并使用DPDK作为memif服务器。
使用方法
1.本地golang服务器 <--memif--> 本地golang客户端
例子可以在/example/simple_echo和/example/bw_test找到。
2.基于DPDK的服务器 <--memif--> 本地golang客户端
可以在/dpdk文件夹中找到dpdk forwarder服务器。
main.c 定义了RX/TX核心和每个核心的队列,将来会通过cli args添加。
unsigned int first_lcore = 25;
char *ipaddr = "11.11.11.11";
char *netmask = "255.255.255.0";
int num_memif = 16;
int num_rx_core = 4;
int num_tx_core = 2;
int server_mode = 1;
如何编译dpdk forwarder?
- 安装和设置dpdk环境可以在以下网址找到
- 编译和运行
cd dpdk
make
sudo ./build/run
- 关于unix sock文件
默认情况下,它将为unix socket创建/tmp/memif.sock文件,以便与golang客户端通信,这个unix socket用于分配内存区域和环形缓冲区。DPDK forwarder需要以root模式运行并自动创建这个文件,所以这个文件必须为golang客户端提供访问权限。
sudo chmod 777 /tmp/memif.sock
- 运行本地golang客户端
cd /example/dpdk_co_worker
运行发送/转发实例...
路线图
- 数据通路上的可靠传输
- 简单的udp级别的发送/转发warpper,用于应用迁移。
- 在未来,我们将使用netDAM的DPU硬件来取代基于dpdk的转发器,并提供完整的本地用户空间memif访问。