基于Golang的内存接口实现

483 阅读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添加。

    

如何编译dpdk forwarder?

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

github.com/zartbot/lea…

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

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

路线图

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

参考

GitHub

查看Github