基于Golang的内存接口实现

518 阅读2分钟

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-ionetDAM。 我们可能在未来将zMemifgo-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?

  1. 安装和设置dpdk环境可以在以下网址找到

github.com/zartbot/lea…

  1. 编译和运行
cd dpdk
make
sudo ./build/run
  1. 关于unix sock文件
    默认情况下,它将为unix socket创建/tmp/memif.sock 文件,以便与golang客户端通信,这个unix socket用于分配内存区域和环形缓冲区。DPDK forwarder需要以root模式运行并自动创建这个文件,所以这个文件必须为golang客户端提供访问权限。
sudo chmod 777 /tmp/memif.sock 
  1. 运行本地golang客户端
cd /example/dpdk_co_worker

运行发送/转发实例...

路线图

  1. 数据通路上的可靠传输
  2. 简单的udp级别的发送/转发warpper,用于应用迁移。
  3. 在未来,我们将使用netDAM的DPU硬件来取代基于dpdk的转发器,并提供完整的本地用户空间memif访问。

参考