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 接口性能的因素是
- 主机系统未使用为 VM
隔离的 CPU
- KVM-QEMU CPU 线程未固定
- QEMU 没有使用大页面支持内存
- QEMU 的模拟器和 io 线程未固定。
- 在 VM 内部,内核引导参数设置为 1GB,这导致 TLB 在主机上丢失。
更正的配置:
- 在主机上设置 4 * 1GB 大页面的主机
- 编辑 qemu XML 以反映所需主机上的 VCPU、iothread、仿真器线程 CPU
- 编辑 qemu 以使用主机 4 * 1GB 页面
- 编辑 VM grub 以隔离 CPU 并使用 2MB 页面。
- 运行 在 VM 上使用独立核心的 DPDK 应用程序
- ubuntu
上的任务集 firecracker 线程
我们能够在当前的 DPDK 代码上实现大约 3.5 到 4 倍的性能。
注意:DPDK主次应用代码性能还有很大提升空间。
背景:
我正在尝试编写一个 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 接口性能的因素是
- 主机系统未使用为 VM 隔离的 CPU
- KVM-QEMU CPU 线程未固定
- QEMU 没有使用大页面支持内存
- QEMU 的模拟器和 io 线程未固定。
- 在 VM 内部,内核引导参数设置为 1GB,这导致 TLB 在主机上丢失。
更正的配置:
- 在主机上设置 4 * 1GB 大页面的主机
- 编辑 qemu XML 以反映所需主机上的 VCPU、iothread、仿真器线程 CPU
- 编辑 qemu 以使用主机 4 * 1GB 页面
- 编辑 VM grub 以隔离 CPU 并使用 2MB 页面。
- 运行 在 VM 上使用独立核心的 DPDK 应用程序
- ubuntu 上的任务集 firecracker 线程
我们能够在当前的 DPDK 代码上实现大约 3.5 到 4 倍的性能。
注意:DPDK主次应用代码性能还有很大提升空间。