DPDK 吞吐量不佳,是配置的问题吗?怎么提高?

DPDK bad throughput, is the configurations' fault? How to improve?

背景:

我正在尝试编写一个 DPDK 应用程序,它应该处理来自虚拟机监视器内部的数据包。

基本上,VMM 从其访客那里获取数据包,然后将这些数据包发送到 DPDK。然后dpdk在网卡上将它们发送出去。

虚拟机 -> 虚拟机管理器 -> DPDK -> 网卡

上面的这个架构应该会取代并超越原来的架构。 在原始架构中,VMM 将数据包放在 TAP 接口上。

原文:

虚拟机 -> 虚拟机管理器 -> TAP 接口 -> NIC

问题:

我写了新架构,吞吐量比使用 TAP 接口时差很多。 (TAP 300MB/s任意方向,Dpdk:50MB/sVM发送方,5MB/sVM接收方)

我怀疑我没有正确配置我的 DPDK 应用程序。 你能对我的配置发表意见吗?

环境:

我已经在 Qemu 虚拟机中完成了所有测试,所以上面描述的架构都在这个虚拟机中 运行:

3 个逻辑 CPU(主机上有 8 个)

4096 MB 内存

OS: Ubuntu 20.4

2 个 NIC,一个用于 SSH,一个用于 DPDK

到目前为止我做了什么:

2GB 大页面

隔离了 DPDK 正在使用的 cpu。

代码如下:https://github.com/mihaidogaru2537/DpdkPlayground/blob/Strategy_1/primary_dpdk_firecracker/server.c

所有功能逻辑都在“lcore_main”中,其他一切都只是配置。

我能找到的关于提高性能的所有建议都涉及硬件而不是配置参数,我不知道我使用的值是否用于诸如:

#define RX_RING_SIZE 2048
#define TX_RING_SIZE 2048

#define NUM_MBUFS 8191
#define MBUF_CACHE_SIZE 250
#define BURST_SIZE 32

好不好。 尽管我是从官方文档中的示例应用程序之一获得它们的。

感谢您的阅读,如果您有任何问题,请告诉我!

更新 1:

1. is VMMuserspcace hypervisor which act as interface to the guest OS?

VMM 是 运行 在用户空间内,是的。 VM 在 VMM 的内存中 运行。 这是 VMM 架构:link

2. Where is the link to VMM?

The vmm link,这是VMM模拟的网络设备。在这里我写了我所有的修改,以便“绑定”到 DPDK primary。

这里有几个直接与 Guest 的内存交互的函数。

例如,当一个数据包需要从访客发送到互联网时:

process_tx()被调用,它从Guest读取数据包并将其发送给DPDK。 执行此操作的代码位于 this line. And a little below is where I do the rte_ring_enqueue

3. as per the setup, DPDK run on the host. is this correct?

所以一切都在 Qemu 中 运行。 DPDK Primary 在 Qemu 中是 运行,Firecracker 在 Qemu 中是 运行。 Firecracker(VMM)的内存中有一个虚拟机。并且 VMM 的代码现在也启动了一个 Secondary DPDK,以便与 Primary 进行通信。主要是在 Qemu NIC 上发送/接收数据包。

因此,如果 host 指的是“物理机”,那么答案是否定的。物理机上没有dpdk

4. You mention you run this inside QEMU. Does this mean using VM you are running DPDK and VMM with another guest OS?

是的,DPDK 和 Virtual Machine Manager 都在客户机 运行 中 OS。 这是 Ubuntu 20.04。我实际上是 运行 Qemu 虚拟机中的 VMM。

5.Since you are using Qemu, please share information of VCPU pinning, and memory backing on host. 

这是我的物理内存。大约 8GB

             total        used        free      shared  buff/cache   available
Mem:          7,6Gi       4,8Gi       955Mi       136Mi       1,9Gi       2,5Gi
Swap:          10Gi          0B        10Gi

lscpu output在物理机上。

关于VCPU pinning:在物理机上我没有隔离任何核心。

[答案基于为提高性能而进行的实时调试和配置设置]

影响内核和 DPDK 接口性能的因素是

  1. 主机系统未使用为 VM
  2. 隔离的 CPU
  3. KVM-QEMU CPU 线程未固定
  4. QEMU 没有使用大页面支持内存
  5. QEMU 的模拟器和 io 线程未固定。
  6. 在 VM 内部,内核引导参数设置为 1GB,这导致 TLB 在主机上丢失。

更正的配置:

  1. 在主机上设置 4 * 1GB 大页面的主机
  2. 编辑 qemu XML 以反映所需主机上的 VCPU、iothread、仿真器线程 CPU
  3. 编辑 qemu 以使用主机 4 * 1GB 页面
  4. 编辑 VM grub 以隔离 CPU 并使用 2MB 页面。
  5. 运行 在 VM 上使用独立核心的 DPDK 应用程序
  6. ubuntu
  7. 上的任务集 firecracker 线程

我们能够在当前的 DPDK 代码上实现大约 3.5 到 4 倍的性能。

注意:DPDK主次应用代码性能还有很大提升空间。