涉及DPDK进程如何进行IPC?

How to do IPC with a DPDK process involved?

我的目标是创建一个 DPDK 应用程序,它将充当虚拟机管理器(在我的例子中是用户空间进程)和 NIC 硬件之间的中间人。

到目前为止,我一直在尝试做一些小规模的事情。我没有使用 VMM,而是使用 C 语言创建了一个虚拟进程。 我设法使用命名信号量和共享内存将虚拟进程“绑定”到 DPDK 进程。 基本上在这个小演示中,DPDK 应用程序从 RX 缓冲区读取并将内容放在共享内存中。然后虚拟进程获取数据并将其打印到标准输出。

DPDK 对多进程通信的所有支持都针对特定情况,其中两个应用程序都在使用 dpdk 的库。 我想知道是否对 一个应用程序未使用这些库的情况提供某种支持。 为什么?因为VMM是用Rust写的,我不知道如何在Rust中添加DPDK库

您认为最有效的沟通方式是什么? 我在想是否可以将 mempool 放在共享内存中并直接从虚拟进程访问 mbufs。

我目前使用的是dpdk 20.11 Ubuntu 20.04

谢谢!

更新 1:

is your question Can I interface/interact DPDK application with non DPDK application

我实际上正在努力寻找的是:如何有效地将 RX 缓冲区上接收到的数据移动到非 dpdk 应用程序?

我目前的做法是:https://imgur.com/a/cF2lq29

这是 dpdk 应用程序的主要逻辑循环,它在 RX 缓冲区上获取数据并将其发送到“非 dpdk 应用程序”。

情况如何:

  1. 从 RX 缓冲区读取数据。
  2. 等到非 dpdk 应用说“我没有使用共享内存,你可以在上面写”
  3. 写入共享内存(为简单起见,写入nb_rx而不是整个数据包)
  4. 向“非 dpdk”应用发送信号,告知现在共享内存可供读取。

如你所见,效率不高,恐怕我的同步方法会造成瓶颈。

所以这让我想知道“有没有更好的方法,按照书上的方法,完成这种交流?

有 3 种方法可以解决 HOST 到 GUEST/Docker 的问题。

  1. 常用方式:允许dpdk应用程序中的所有物理网卡,如SPP、OVS、VPP和DPDK priamry-secodnary,利用virtio、vhost库、memif或共享MMAP大页面,以允许copy/zero-copy模式到VM/Docker.
  2. 复杂复制方式:在主机上的DPDK应用程序和运行在HOST/GUEST/Docker.
  3. 上的非DPDK应用程序之间创建一个共享内存位置
  4. 模拟零拷贝方式:非DPDK应用程序在固定位置的共享内存中创建DMA缓冲区。在 DPDK 应用程序中,为物理端口使用外部内存缓冲区 MBUF。 DPDK PMD(支持外部 MBUF)然后可以将数据包 DMA 到共享区域。

由于选项 2 和 3 并不常见,让我解释一下您最终可能如何开发解决方案。

选项 2:

  • 使用shared mmap area开发简单的非DPDK应用程序,将区域划分为固定数据包大小(最大大小)。然后分配一半给TX,一半给RX。
  • 初始化 DPDK 应用程序以使用创建的 mmap 区域。
  • 使用原子头指针和尾指针维护数据包访问
  • RX-burst 之后的DPDK 应用程序在收到数据包时会通过查询头指针得到一个空白索引,然后memcopy 数据包到特定的索引。一旦完成 DPDK 应用程序将调用 rte_mbuf_free.
  • 非 DPDK 应用程序可以使用尾指针从共享内存中获取有效的 RX 数据包。
  • 使用单独的位置索引和 head/tail 指针对 TX 执行类似的操作。

缺点:

  1. 数据包吞吐量大幅降低。
  2. 复制数据包内存使用CPU CYCLES
  3. 维护 rx 和 tx 的索引、头指针和尾指针的复杂公共库。
  4. 内存 space 为最大数据包过度配置,因为流量无法预测。

选项 3:

  1. 使用 posix_memalign API 创建共享 mmap,2000 字节的多个区域。
  2. 使用简单的数据结构(描述符)来保存{虚拟地址,物理地址,长度,值}
  3. 使用上述格式填充每个索引创建 SHM 区域。
  4. 初始化 DPDK 应用程序以访问 SHM 和 MMAPed 区域
  5. 在 DPDK 应用程序中填充 rte_pktmbuf_pool_create_extbuf,其中 ext_mem 表示填充在 SHM 物理地址下的 DMA 区域(不确定这是否有效,因为最初的目的不同)。
  6. 注册回调处理程序以在我们 rx_burst 数据包后进行垃圾收集。
  7. 在 TX 中,有 2 个选项,a) 简单地将缓冲区复制到 rte_mbuf 和 b) 创建一个间接缓冲区以附​​加 rte_mbuf 与外部缓冲区,等到 NIC 实际上发送数据包(通过完成队列)

选项 2 的缺点:

  1. 在 RX 端使用零拷贝的复杂方式
  2. 复制模式是最容易实现的方法。
  3. 缓冲区管理很脆弱。
  4. 假设适用于 RX-TX 的 1 个线程。

建议:如果不打算使用 VPP、SPP、OVS,那么最简单的方法是使用 Primary-Secondary DPDK 格式,其中所有 RX mbuf 和 TX mbuf 在 2 个进程之间可用,因为它在大页面中映射。