QEMU/KVM PCI Passthrough(i350) & DPDK 网络性能测试

硬件要求:

  • CPU必须支持硬件虚拟化(Intel VT-d or AMD-Vi) 和 IOMMU


原图链接

主机配置

设置iommu

IOMMU kernel 配置, 确保以下配置项已启用:

Device Drivers --->[*] IOMMU Hardware Support --->Generic IOMMU Pagetable Support ----[*]   AMD IOMMU support<*>     AMD IOMMU Version 2 driver[*]   Support for Intel IOMMU using DMA Remapping Devices[*]     Support for Shared Virtual Memory with Intel IOMMU[*]     Enable Intel DMA Remapping Devices by default[*]   Support for Interrupt Remapping

IOMMU kernel 启动参数配置:

  • 对于 Intel CPU(VT-d),使用 intel_iommu=on
  • 对于 AMD CPU(AMD-Vi),使用 amd_iommu=on
$ sudo uname -a
Linux fc34 5.13.14-200.fc34.x86_64 #1 SMP Fri Sep 3 15:33:01 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ sudo grubby --update-kernel=ALL --args="iommu=pt intel_iommu=on default_hugepagesz=1G"

reboot 后确认 IOMMU 已启用:

$  dmesg  |grep -i -e DMAR -e IOMMU
[    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.13.14-200.fc34.x86_64 root=/dev/mapper/fedora_fedora-root ro rd.lvm.lv=fedora_fedora/root iommu=pt intel_iommu=on default_hugepagesz=1G intel_idle.max_cstate=0 processor.max_cstate=0 nohz=on rcu_nocb_poll audit=0 nosoftlockup nospectre_v1 nospectre_v2 spectre_v2=off nospec_store_bypass_disable no_stf_barrier nopti ssbd=off l1tf=off tsx=off tsx_async_abort=off mds=off srbds=off
[    0.013021] ACPI: DMAR 0x000000007EF6A000 0000D8 (v01 INSYDE Romley   00000001 ACPI 00000001)
[    0.013053] ACPI: Reserving DMAR table memory at [mem 0x7ef6a000-0x7ef6a0d7]
[    0.257029] Kernel command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.13.14-200.fc34.x86_64 root=/dev/mapper/fedora_fedora-root ro rd.lvm.lv=fedora_fedora/root iommu=pt intel_iommu=on default_hugepagesz=1G intel_idle.max_cstate=0 processor.max_cstate=0 nohz=on rcu_nocb_poll audit=0 nosoftlockup nospectre_v1 nospectre_v2 spectre_v2=off nospec_store_bypass_disable no_stf_barrier nopti ssbd=off l1tf=off tsx=off tsx_async_abort=off mds=off srbds=off
[    0.257134] DMAR: IOMMU enabled
[    0.469532] DMAR: Host address width 46
[    0.469637] DMAR: DRHD base: 0x000000fbffe000 flags: 0x0
[    0.469750] DMAR: dmar0: reg_base_addr fbffe000 ver 1:0 cap d2078c106f0462 ecap f020fe
[    0.469886] DMAR: DRHD base: 0x000000ebffc000 flags: 0x1
[    0.469997] DMAR: dmar1: reg_base_addr ebffc000 ver 1:0 cap d2078c106f0462 ecap f020fe
[    0.470132] DMAR: RMRR base: 0x0000007ea8c000 end: 0x0000007ea94fff
[    0.470246] DMAR-IR: IOAPIC id 10 under DRHD base  0xfbffe000 IOMMU 0
[    0.470357] DMAR-IR: IOAPIC id 8 under DRHD base  0xebffc000 IOMMU 1
[    0.470481] DMAR-IR: IOAPIC id 9 under DRHD base  0xebffc000 IOMMU 1
[    0.470592] DMAR-IR: HPET id 0 under DRHD base 0xebffc000
[    0.470700] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.471512] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    1.374638] iommu: Default domain type: Passthrough (set via kernel command line)
[    1.475745] DMAR: No ATSR found
[    1.475855] DMAR: No SATC found
[    1.475862] DMAR: dmar0: Using Queued invalidation
[    1.476206] DMAR: dmar1: Using Queued invalidation
[    1.476483] pci 0000:00:00.0: Adding to iommu group 0
[    1.476660] pci 0000:00:01.0: Adding to iommu group 1

隔离 i350 网卡

确认 kernel 配置中 VFIO 选项都已启用:

Device Drivers ---><M> VFIO Non-Privileged userpsace driver framework --->[*]   VFIO No-IOMMU support ----<M>   VFIO support for PCI devices[*]     VFIO PCI support for VGA devices< >   Mediated device driver framework

注:
fedora 默认不开启 VFIO No-IOMMU support.

配置 hugepages,安装 dpdk 并绑定 i350 网卡到 vfio-pci 驱动:

$ sudo dnf install dpdk dpdk-tools -y
dpdk-20.11-1.fc34.x86_64
dpdk-tools-20.11-1.fc34.x86_64
$ sudo echo 16 > /proc/sys/vm/nr_hugepages
$ sudo modprobe vfio-pci
$ sudo dpdk-hugepages.py -s
Node Pages Size Total
0    8     1Gb    8Gb
1    8     1Gb    8GbHugepages mounted on /dev/hugepages
$ sudo dpdk-devbind.py -b vfio-pci 02:00.3
$ sudo dpdk-devbind.py -sNetwork devices using DPDK-compatible driver
============================================
0000:02:00.3 'I350 Gigabit Network Connection 1521' drv=vfio-pci unused=igbNetwork devices using kernel driver
===================================
0000:02:00.0 'I350 Gigabit Network Connection 1521' if=eno1 drv=igb unused=vfio-pci *Active*
0000:05:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=enp5s0f0 drv=ixgbe unused=vfio-pci
0000:05:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=enp5s0f1 drv=ixgbe unused=vfio-pci

调整 CPU 模式为 performance 模式:

$ sudo cpupower frequency-set -g performance

QEMU/KVM

由主机PCI 网卡直接分配(PCI Passthrough):
-device vfio-pci,host=02:00.3
使用主机 hugepages:
-m 8G -object memory-backend-file,id=mem,size=8G,mem-path=/dev/hugepages,share=on \ -mem-prealloc -numa node,memdev=mem

$ sudo qemu-kvm -version
QEMU emulator version 3.0.1 (qemu-3.0.1-4.fc29)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers$ sudo qemu-system-x86_64 -M q35,accel=kvm,kernel-irqchip=split \-nographic --enable-kvm \-rtc base=localtime,clock=host \-m 8G -object memory-backend-file,id=mem,size=8G,mem-path=/dev/hugepages,share=on \-mem-prealloc -numa node,memdev=mem -overcommit mem-lock=on \-smp 8 -cpu host \-device intel-iommu,intremap=on,device-iotlb=on \-device ioh3420,id=pcie.1,chassis=1 -no-hpet \-netdev tap,id=net0,vhostforce,queues=4 \-device virtio-net-pci,bus=pcie.1,netdev=net0,disable-legacy=on,disable-modern=off,iommu_platform=on,ats=on,vectors=10 \-device vfio-pci,host=02:00.3 \centos8-disk.qcow2

配置虚拟机

kernel 启动参数:

$ sudo grubby --update-kernel=ALL --args="default_hugepagesz=1G"

dpdk & hugepages & vfio 配置:

$ sudo echo 2 > /proc/sys/vm/nr_hugepages
$ sudo modprobe vfio enable_unsafe_noiommu_mode=1
$ sudo modprobe vfio-pci
$ sudo dpdk-devbind -b vfio-pci 00:03.0
$ sudo dpdk-hugepages.py -s
Node Pages Size Total
0    2     1Gb    2GbHugepages mounted on /dev/hugepages$ sudo dpdk-devbind.py  -sNetwork devices using DPDK-compatible driver
============================================
0000:00:03.0 'I350 Gigabit Network Connection 1521' drv=vfio-pci unused=igbNetwork devices using kernel driver
===================================
0000:01:00.0 'Virtio network device 1041' if=eth0 drv=virtio-pci unused=vfio-pci *Active*$ sudo cpupower frequency-set -g performance

虚拟机 rxonly 测试

主机 testpmd txonly 发包

$ sudo dpdk-testpmd  -c 0xfc -m 4096 -a 02:00.3 -n 2 \-- -i --rxd=1024 --txd=1024 \--rxq=4 --txq=4 --nb-cores=4 \--forward-mode=txonly \--txpkts=64 \--mlockall -a
testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 0          RX-missed: 0          RX-bytes:  0RX-errors: 0RX-nombuf:  0         TX-packets: 25246875   TX-errors: 0          TX-bytes:  1615800204Throughput (since last show)Rx-pps:            0          Rx-bps:            0Tx-pps:      1420592          Tx-bps:    727342616############################################################################
testpmd> quit

虚拟机 testpmd rxonly 收包:

dpdk-testpmd -c 0xfc -m 2048 -a 00:03.0 -- -i -a  \--rxq=1 --txq=1 --nb-cores=4 \--rxd=2048 --txd=2048 --enable-rx-cksum --mlockall \--forward-mode=rxonly
testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 327892831  RX-missed: 14493499   RX-bytes:  20970135168RX-errors: 0RX-nombuf:  0         TX-packets: 1          TX-errors: 0          TX-bytes:  60Throughput (since last show)Rx-pps:      1420609          Rx-bps:    727351720Tx-pps:            0          Tx-bps:            0############################################################################

虚拟机 txonly 测试

虚拟机 testpmd txonly 发包:

$ sudo dpdk-testpmd -c 0xfc -m 2048 -a 00:03.0 -- -i -a  \--rxq=1 --txq=1 --nb-cores=4 \--rxd=2048 --txd=2048 --enable-rx-cksum --mlockall \--forward-mode=txonly --txpkts=64
testpmd> show port stats  all######################## NIC statistics for port 0  ########################RX-packets: 0          RX-missed: 0          RX-bytes:  0RX-errors: 0RX-nombuf:  0         TX-packets: 5665824    TX-errors: 0          TX-bytes:  362613416Throughput (since last show)Rx-pps:            0          Rx-bps:            0Tx-pps:      1420607          Tx-bps:    727350144############################################################################
testpmd>

主机 testpmd rxonly 收包:

$ sudo dpdk-testpmd  -c 0xfc -m 4096 -a 02:00.3 -n 2  \-- -i --rxd=2048 --txd=2048 \--rxq=4 --txq=4 --nb-cores=4 \--forward-mode=rxonly --mlockall -a
testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 34979352   RX-missed: 0          RX-bytes:  2238678868RX-errors: 0RX-nombuf:  0         TX-packets: 0          TX-errors: 0          TX-bytes:  0Throughput (since last show)Rx-pps:      1420598          Rx-bps:    727346200Tx-pps:            0          Tx-bps:            0############################################################################
testpmd>

wirespeed

最终测试结果RX/TX都可达到千兆网络 64 字节小包线速.
CPU:

$ sudo lscpu
[root@centos-guest ~]# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              8
On-line CPU(s) list: 0-7
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           8
NUMA node(s):        1
Vendor ID:           GenuineIntel
BIOS Vendor ID:      QEMU
CPU family:          6
Model:               45
Model name:          Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
BIOS Model name:     pc-q35-6.1
Stepping:            7
CPU MHz:             2599.998
BogoMIPS:            5199.99
Virtualization:      VT-x
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            4096K
L3 cache:            16384K
NUMA node0 CPU(s):   0-7
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc archs
[root@centos-guest ~]#

guest rxonly:

testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 0          RX-missed: 0          RX-bytes:  0RX-errors: 0RX-nombuf:  0         TX-packets: 239624814  TX-errors: 0          TX-bytes:  14377489160Throughput (since last show)Rx-pps:            0          Rx-bps:            0Tx-pps:      1488316          Tx-bps:    714392640############################################################################
testpmd>

guest txonly:

testpmd> show port stats all######################## NIC statistics for port 0  ########################RX-packets: 125837569  RX-missed: 0          RX-bytes:  7550254396RX-errors: 1RX-nombuf:  0         TX-packets: 0          TX-errors: 0          TX-bytes:  0Throughput (since last show)Rx-pps:      1488207          Rx-bps:    714339808Tx-pps:            0          Tx-bps:            0############################################################################
testpmd>

QEMU/KVM PCI Passthrough(i350) DPDK 网络性能测试相关推荐

  1. KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  2. linux禁用及启用pcie设备,KVM 介绍(4):I/O设备直接分配和 SRIOV [KVM PCI/PCIe PassThrough SRIOV]...

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. KVM网络模型之:PCI Passthrough

    目录 PCI Passthrough技术介绍和KVM中配置 案例 内核启用 重新启动虚拟机实例 PCI Passthrough技术介绍和KVM中配置 PCI Passthrough技术是虚拟化网卡的终 ...

  4. 《深入浅出DPDK》——DPDK网络功能虚拟化

    DPDK网络功能虚拟化 NFV(Network Function Virtualization)即网络功能虚拟化.初衷是通过使用英特尔X86等通用服务器硬件平台以及虚拟化技术.来承载基于软件实现的网络 ...

  5. 理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  6. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)...

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  7. QEMU KVM Libvirt手册(7): 硬件虚拟化

    在openstack中,如果我们启动一个虚拟机,我们会看到非常复杂的参数 qemu-system-x86_64 -enable-kvm -name instance-00000024 -S -mach ...

  8. 【KVM系列07】使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    第七章 使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 1. QEMU/KVM 快照 1.1 概念 1.2 使用 virsh 实验 1.3 外部快照的删除 2. OpenSt ...

  9. 【KVM系列06】Nova 通过 libvirt 管理 QEMU/KVM 虚机

    第六章 Nova 通过 libvirt 管理 QEMU/KVM 虚机 1. Libvirt 在 OpenStack 架构中的位置 2. Nova 中 libvirt 的使用 2.1 创建 QEMU/K ...

  10. QEMU/KVM原理概述

    1. QEMU与KVM 架构 qemu 和 kvm 架构整体上分为 3 部分,对应着上图的三个部分 (左上.右上和下),3 部分分别是 VMX root 的应用层,VMX no-root 和 VMX ...

最新文章

  1. java中表示二进制、八进制、十进制、十六进制,double、float、整型
  2. BroadcastReceiver 接收系统短信广播
  3. python-opencv时间计算,视频物体追踪标记
  4. android 向左滑动动画,Android中的滑动动画
  5. Python中装饰器的理解和实现
  6. 线段树之线段操作之陈老师的福利
  7. 基于Matlab的跨孔CT胖射线追踪算法(五)
  8. 【Elasticsearch】 es 集群发现机制
  9. 小白R语言数据可视化进阶练习一
  10. 数据操作(基于MXNET框架)
  11. b 站视频下载神器合集,支持电脑和手机端
  12. FYI | 谷歌的summer project围观一下
  13. web开发第三方登陆之facebook登陆
  14. CCF系列题解--2015年9月第二题 日期计算
  15. TomCat报404错误是什么原因?该怎么解决?
  16. 快速了解 CMYK印刷色与三原色,CMY三原色为什么要加K黑色?
  17. react 日期怎么格式化_react日期格式化组件
  18. 台式计算机连接,台式电脑连接网络步骤
  19. MATLAB 生成高清 矢量图+图局部放大
  20. ternary content-addressable memory (TCAM)

热门文章

  1. 03_部署并访问项目,处理404,500(servlet+java bean+jsp的商城教程)
  2. Java线程并发与安全性问题详解
  3. Mac x 10.12.4 如何安装sshfs
  4. androidru使用adb启动activity和monkeyrunner启动activity
  5. 单引号、双引号、倒引号
  6. detach screen_linux screen命令详解和常见问题解决
  7. python快速排序时间复杂度-快速排序python实现总结
  8. 在html5中插入flash,如何将Flash嵌入到HTML5中?
  9. WordPress 安装主题时 提示 “无法创建目录”
  10. nginx 文件服务器_Nginx必不可少啊!!!