首页 > 解决方案 > DPDK 吞吐量不佳,是配置的问题吗?怎么提高?

问题描述

背景:

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

基本上,VMM 从它的客户那里获取数据包,然后将这些数据包发送到 DPDK。然后 Dpdk 将它们发送到 NIC 上。

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

上面的这种架构应该取代并优于原始架构。在原始架构中,VMM 将数据包放在 TAP 接口上。

原来的:

虚拟机 -> 虚拟机管理器 -> TAP 接口 -> 网卡

问题:

我已经编写了新架构,但吞吐量比使用 TAP 接口时要差得多。(TAP 300 MB/s 任意方向,Dpdk:50MB/s VM 发送器,5MB/s VM 接收器)

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

环境:

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

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

4096 MB 内存

操作系统:Ubuntu 20.4

2 个网卡,一个用于 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 架构:链接

2. Where is the link to VMM?

vmm 链接,这是 VMM 模拟的网络设备。这是我编写所有修改以“绑定”到 DPDK 主节点的地方。

这里有几个函数直接与来宾的记忆交互。

例如,当需要从 Guest 向 Internet 发送数据包时:

调用 process_tx(),它从 Guest 读取数据包并将其发送到 DPDK。执行此操作的代码位于这一行。下面是我做 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 通信。Primary 在 Qemu NIC 上发送/接收数据包。

因此,如果主机我们的意思是“物理机”,那么答案是否定的。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 都在客户操作系统中运行。这是一个 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 。

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

标签: dpdk

解决方案


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

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

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

更正配置:

  1. 在主机上设置具有 4 * 1GB 巨页的主机
  2. 编辑 qemu XML 以反映所需主机 CPU 上的 VCPU、iothread、模拟器线程
  3. 编辑 qemu 以使用主机 4 * 1GB 页面
  4. 编辑 VM grub 以隔离 CPU 并使用 2MB 页面。
  5. 在 VM 上使用隔离核心运行 DPDK 应用程序
  6. ubuntu上的taskset鞭炮线程

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

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


推荐阅读