J4125折腾笔记2 虚拟网卡性能对比

2021-09-20 11:17:33 44点赞 188收藏 27评论

创作立场声明:一直很好奇直通网卡对性能的影响,为了论证网上的观点,自己测试一下看看会有什么样的结果

前言

上一期已经把KVM系统搭建完毕并且安装了一个OpenWRT虚拟机,很多人都说,要想软路由性能好,尽量把网卡直通给它,对这样的论断我比较好奇是否靠谱,那这一次我就来做个测试对比一下,同时我也将顺便测试一下虚拟网卡在不同模式下的网速表现,找出最优的网卡模式。下文将进行直通模式,普通虚拟网卡模式,主机网卡共享模式三种模式的速度对比,可能不是很严谨,权当抛砖引玉,给大家一点参考。

J4125折腾笔记2 虚拟网卡性能对比

测试设备

  1. 组装台式机,网卡Killer E2200,作为iperf3服务端运行

  2. J41225主机,网卡Intel I211 x 4,KVM虚拟机运行自编译OpenWRT虚拟机,集成iperf3,主要测试软路由WAN口上下行速度

  3. ThinkPad X230,网卡Intel 82579LM,使用iperf3测试软路由LAN口的上下行NAT速度

网卡直通必要条件

KVM如果需要进行设备直通的话,首先需要确保主板支持VT-d,否则无法进行设备直通,J4125的小主机主板还是支持的,所以直接进行配置操作即可。

网卡直通模式

  1. 开启IOMMU

    输入输出内存管理单元(英语:input–output memory management unit,缩写IOMMU)是一种内存管理单元(MMU),它将具有直接存储器访问能力(可以DMA)的I/O总线连接至主内存。如传统的MMU(将CPU可见的虚拟地址转换为物理地址)一样,IOMMU将设备可见的虚拟地址(在此上下文中也称设备地址或I/O地址)映射到物理地址。部分单元还提供内存保护功能,防止故障或恶意的设备。

  • 在Rocky Linux下开启IOMMU很简单,只需要编辑一个配置文件即可,直接进行编辑vi /etc/default/grub,找到GRUB_CMDLINE_LINUX这一行,在末尾添加rhgb quiet intel_iommu=on iommu=pt此处注意有空格,保存退出即可(如果不熟悉vi的操作,使用winscp连接主机之后打开相应文件进行编辑也可以);

    修改前:

    GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true

    修改后:

    GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet intel_iommu=on iommu=pt" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true

  • 重新生成grub.cfg文件,这个需要考虑两种情况,如果使用普通的逻辑启动,那么直接执行这个命令即可:grub2-mkconfig -o /boot/grub2/grub.cfg,如果使用UEFI启动的话,则执行gurb2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg;

  • 没有什么报错的话重启系统就行了,直接在终端下执行reboot;

  • 登陆系统之后执行dmesg |grep -i iommu,如果出现IOMMU相关的内容,比如下面那样的,那么IOMMU就配置成功了。

    [ 0.000000] DMAR: IOMMU enabled [ 0.001043] DMAR-IR: IOAPIC id 1 under DRHD base 0xfed65000 IOMMU 1 [ 0.103023] iommu: Default domain type: Passthrough [ 0.831912] pci 0000:00:00.0: Adding to iommu group 0 [ 0.831926] pci 0000:00:02.0: Adding to iommu group 1 [ 0.831939] pci 0000:00:0e.0: Adding to iommu group 2 [ 0.831955] pci 0000:00:0f.0: Adding to iommu group 3 [ 0.831972] pci 0000:00:12.0: Adding to iommu group 4 [ 0.831992] pci 0000:00:13.0: Adding to iommu group 5 [ 0.832024] pci 0000:00:13.1: Adding to iommu group 6 [ 0.832044] pci 0000:00:13.2: Adding to iommu group 7 [ 0.832059] pci 0000:00:13.3: Adding to iommu group 8 [ 0.832075] pci 0000:00:14.0: Adding to iommu group 9 [ 0.832090] pci 0000:00:14.1: Adding to iommu group 10 [ 0.832113] pci 0000:00:15.0: Adding to iommu group 11 [ 0.832131] pci 0000:00:1f.0: Adding to iommu group 12 [ 0.832150] pci 0000:00:1f.1: Adding to iommu group 12 [ 0.832165] pci 0000:01:00.0: Adding to iommu group 13 [ 0.832184] pci 0000:02:00.0: Adding to iommu group 14 [ 0.832199] pci 0000:03:00.0: Adding to iommu group 15 [ 0.832213] pci 0000:04:00.0: Adding to iommu group 16

选择需要直通的网卡

  • 查看所有设备的物理地址可以使用这个命令:virsh nodedev-list --tree,此时就会出现下述设备列表;

    +- pci_0000_00_00_0 +- pci_0000_00_02_0 | | | +- drm_card0 | +- drm_renderD128 | +- pci_0000_00_0e_0 +- pci_0000_00_0f_0 +- pci_0000_00_12_0 | | | +- scsi_host0 | | | | | +- scsi_target0_0_0 | | | | | +- scsi_0_0_0_0 | | | | | +- block_sda_UBA2RFO50H0CE1_EMF_CS_11001590140 | | +- scsi_generic_sg0 | | | +- scsi_host1 | +- pci_0000_00_13_0 | | | +- pci_0000_01_00_0 | | | +- net_enp1s0_00_f1_f3_1e_77_02 | +- pci_0000_00_13_1 | | | +- pci_0000_02_00_0 | | | +- net_enp2s0_00_f1_f3_1e_77_03 | +- pci_0000_00_13_2 | | | +- pci_0000_03_00_0 | | | +- net_eno1_00_f1_f3_1e_77_04 | +- pci_0000_00_13_3 | | | +- pci_0000_04_00_0 | | | +- net_enp4s0_00_f1_f3_1e_77_05 | +- pci_0000_00_14_0 +- pci_0000_00_14_1 +- pci_0000_00_15_0 | | | +- usb_usb1 | | | | | +- usb_1_0_1_0 | | +- usb_1_1 | | | | | +- usb_1_1_1_0 | | +- usb_1_1_1_1 | | | +- usb_usb2 | | | +- usb_2_0_1_0 | +- pci_0000_00_1f_0 +- pci_0000_00_1f_1

    如果感觉这样看搞得自己一头雾水,也可以使用lspci这个命令,执行之后也能显示出完整的设备列表,包括显卡声卡,SATA控制器等内容都能完整列出

    00:00.0 Host bridge: Intel Corporation Gemini Lake Host Bridge (rev 06) 00:02.0 VGA compatible controller: Intel Corporation GeminiLake [UHD Graphics 600] (rev 06) 00:0e.0 Audio device: Intel Corporation Celeron/Pentium Silver Processor High Definition Audio (rev 06) 00:0f.0 Communication controller: Intel Corporation Celeron/Pentium Silver Processor Trusted Execution Engine Interface (rev 06) 00:12.0 SATA controller: Intel Corporation Celeron/Pentium Silver Processor SATA Controller (rev 06) 00:13.0 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:13.1 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:13.2 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:13.3 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:14.0 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:14.1 PCI bridge: Intel Corporation Gemini Lake PCI Express Root Port (rev f6) 00:15.0 USB controller: Intel Corporation Celeron/Pentium Silver Processor USB 3.0 xHCI Controller (rev 06) 00:1f.0 ISA bridge: Intel Corporation Celeron/Pentium Silver Processor LPC Controller (rev 06) 00:1f.1 SMBus: Intel Corporation Celeron/Pentium Silver Processor Gaussian Mixture Model (rev 06) 01:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03) 02:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03) 03:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03) 04:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)

  • 确定网卡的具体地址,根据上述的地址信息,判断网卡,由于需要测试路由模式下的网速表现,需要两块网卡做直通(此处不考虑单臂路由的性能);

  • 如果需要直通eno1这块网卡的,则可以确定设备地址是pci_0000_03_00_0,同样的enp4s0这块网卡的地址是pci_0000_04_00_0

进行网卡直通

  • —persistent 这个选项会将直通配置自动写入虚拟机的xml配置文件,如果虚拟机正在运行,则进行热插入;

  • —config 这个选项会将直通配置自动写入虚拟机的xml配置文件,只有在虚拟机重启之后才会生效直通;

  • —live 这个选项只在运行的虚拟机上有效,设备会热插入虚拟机,并不会修改虚拟机的配置文件,所以重启虚拟机直通会失效;

  • —current 使用这个选项的话,如果虚拟机正在运行,直通设备会进行热插入,但不会改写虚拟机配置文件,虚拟机重启后失效,如果虚拟机不在运行,那么会修改配置文件,在下次虚拟机启动的时候生效。

    具体使用哪个选项就看个人喜好咯,我一般使用--config,配置完之后直接重启虚拟机,省得出问题,此处我直接执行virsh attach-device openwrt /hostdev/eno1.xml --config

    [root@localhost ~]# virsh attach-device openwrt /hostdev/eno1.xml --config 成功附加设备

    没有报错的话就是成功了,同样的如果需要分离的话直接执行virsh detach-device openwrt /hostdev/eno1.xml --config

    [root@localhost ~]# virsh detach-device openwrt /hostdev/eno1.xml --config 成功分离设备

  • 获取计算机可以读懂的网卡信息,virsh nodedev-dumpxml pci_0000_04_00_0,这条命令可以获取以下信息,此处需要<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>这条内容,另一张网卡也需要这样获取,记录好这两条信息;

    <device> <name>pci_0000_04_00_0</name> <path>/sys/devices/pci0000:00/0000:00:13.3/0000:04:00.0</path> <parent>pci_0000_00_13_3</parent> <driver> <name>igb</name> </driver> <capability type='pci'> <class>0x020000</class> <domain>0</domain> <bus>4</bus> <slot>0</slot> <function>0</function> <product id='0x1539'>I211 Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <iommuGroup number='16'> <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </iommuGroup> <pci-express> <link validity='cap' port='0' speed='2.5' width='1'/> <link validity='sta' speed='2.5' width='1'/> </pci-express> </capability> </device>

  • 编写直通设备配置信息,在任意位置编写一个xml文件,标准格式如下,引入了上面获取的地址信息,我将其命名为enp4s0.xml,存储在”/hostdev“目录下:

    <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </source> </hostdev>

    其中需要注意managed的值应该是yes,这个选项可以让虚拟机启动时自动进行设备直通

  • 如果想对设备进行热插拔,则执行:virsh nodedev-detach pci_0000_04_00_0从主机分离设备,virsh attach-device $vm_name $xml_file --config将设备直通至虚拟机,我在此处添加了一个--config选项,下面有四个选项的说明。

虚拟网卡对照组

虚拟网卡支持多种网卡类型,包括:virtio、e1000e、e1000、rtl8139,想要什么直接在网卡编辑中进行选择即可

不同网卡和型号的对用关系

Linux,perfPCIPCI,legacyPCI,legacy
virtioe1000ee1000rtl8139

注意e1000和rt8139对应的型号都是PCI,legacy,只能按照顺序来判断到底是哪个网卡,一般最后的一个PCI,legacy就是rtl8139,这应该是cockpit界面的一个bug,不知道什么时候会修复。

由于需要使用两个网口,所以我将主机的第一和第二的网卡设置成了两个网桥,分别在这两个网桥上添加虚拟网卡,作为OpenWRT的WAN口和LAN口:

添加网桥

J4125折腾笔记2 虚拟网卡性能对比

J4125折腾笔记2 虚拟网卡性能对比

添加网卡

J4125折腾笔记2 虚拟网卡性能对比

切换虚拟网卡类型

J4125折腾笔记2 虚拟网卡性能对比

主机网卡共享对照组

除了基于网桥的虚拟网卡模式之外,还有一种基于Macvtap驱动网卡共享模式,即direct模式,在这种模式下,主机网卡和虚拟机网卡是一样的,都是通过Macvtap网桥连接的。

注意: Macvtap 不能与Linux网桥搭配使用,所以使用这个功能的时候不需要预先建立网桥,直接选择一个网卡进行共享即可

启用Macvtap很方便,直接点击添加网络接口,接口类型选择Direct attachment,源选择需要共享的网卡,此处不能选择网桥或者在网桥内的网卡,型号的话此处使用的是virtio,当然如果虚拟机系统不支持virtio网卡,也可以选择别的型号,默认情况下会生成一个mode是vepa的网卡,配置文件结构如下:

<interface type='direct'> <mac address='aa:bb:cc:dd:ee:ff'/> <source dev='epn4' mode='vepa'/> <model type='virtio'/></interface>

应该是cockpit的界面还不够完善,模式默认只会生成vepa的,如果想要切换,需要手动编辑虚拟机的配置文件,Macvtap支持四种模式,说明如下:

  • vepa: 该模式会将虚拟机的所有流量都发送到与之对接的交换机,多个虚拟机之间不能直接通信,必须通过外部支持vepa功能的交换机转发,所以该网卡不外接交换机的话虚拟机之间将被隔离;

  • bridge: 该模式的功能类似于其字面意思,将网卡作为桥使用,所以虚拟机之间可以在网卡上直接通信;

  • private: 私人模式,虚拟机之间进行了隔离,通讯依赖于外部交换设备;

  • passthrough: 直通模式,此模式常搭配SR-IOV使用,网络接口不可共享,相当于独占了该网卡,I211由于不支持SR-IOV,所以可能效果和私人模式类似。

添加网卡

J4125折腾笔记2 虚拟网卡性能对比

J4125折腾笔记2 虚拟网卡性能对比

修改网卡模式只能编辑虚拟机配置文件,关闭虚拟机,执行virsh edit openwrt,修改完成之后保存退出即可

J4125折腾笔记2 虚拟网卡性能对比

J4125折腾笔记2 虚拟网卡性能对比

测试步骤

本次测试主要通过iperf3进行测试,我预先在编译OpenWRT时集成了iperf3,所以可以直接使用,我的台式机作为服务端,虚拟机和笔记本分别作为客户端测试WAN口及LAN的网速情况

台式机执行iperf3 -s作为服务端运行,网卡地址172.16.1.200

J4125折腾笔记2 虚拟网卡性能对比

J4125上OpenWRT直接执行iperf3 -c 172.16.1.200测试WAN口下行速度,执行iperf3 -c 172.16.1.200 -R测试WAN口上行速度

J4125折腾笔记2 虚拟网卡性能对比

ThinkPad也执行上述两个命令测试LAN口上下行速度

测试结果

直通模式

J4125折腾笔记2 虚拟网卡性能对比

虚拟网卡模式

J4125折腾笔记2 虚拟网卡性能对比

Macvtap共享模式

J4125折腾笔记2 虚拟网卡性能对比


直通网卡bridge + virtiobridge + e1000ebridge + e1000bridge + rtl8139direct + vepadirect + bridgedirect + privatedirect + passthrough
WAN下行932Mb/s943Mb/s922Mb/s917Mb/s919Mb/s932Mb/s939Mb/s790Mb/s763Mb/s
WAN上行919Mb/s925Mb/s902Mb/s923Mb/s712Mb/s883Mb/s930Mb/s779Mb/s918Mb/s
LAN(NAT)下行878Mb/s909Mb/s425Mb/s260Mb/s149Mb/s734Mb/s914Mb/s720Mb/s859Mb/s
LAN(NAT)上行912Mb/s919Mb/s353Mb/s159Mb/s280Mb/s768Mb/s916Mb/s725Mb/s898Mb/s

结果分析

根据上述的测试结果,结合测试过程中的一些观察,我得到了一些有趣的结果:

  • 直通模式下NAT转发处理器占用基本没有多少变化,而虚拟网卡或者Macvtap下都会有比较大的变化,特别是Macvtap模式下

  • 虚拟网卡的virtio和Macvtap的bridge模式可以获得和直通类似的速度表现(千兆环境下)

  • e1000和rtl8139的NAT性能实在是有点惨不忍睹

  • 大部分情况下下行速度都会略大于上行速度

总结

测试了一圈,最后发现还是直通最靠谱(不知道是不是白费工),当然,如果遇到不能直通的主板,virtio和Macvtap的bridge也是可以选择的,特别要避开rtl8139这个坑,当然,这个测试一点都不严谨,影响速度的因素还有很多,希望有经验的大佬能分享一下心得……

最后,感谢大家的阅读,文笔比较差,希望大家海涵。

展开 收起
27评论

  • 精彩
  • 最新
  • 太专业了,我直接跳过内容看结论 [无奈]

    校验提示文案

    提交
    结论才是重点,当然,怎么直通也可以看看

    校验提示文案

    提交
    收起所有回复
  • 网络性能不应以带宽来算,应该以包吞吐量计算。
    对于正规网络设备,都是给出小包吞吐量。
    对于家用设备,应该按照IMIX(模拟日常使用大小包配比)来算。

    所以你的测试应该调整下iperf3的参数,否则做不得准。

    校验提示文案

    提交
    都是被带偏的,没几个会去了解转发效率高低 [大囧] 然而这个却是十分重要的性能参数

    校验提示文案

    提交
    之后附加上小包的测试

    校验提示文案

    提交
    收起所有回复
  • 这,正经脸 应该记录下cpu消耗把。 虚拟网卡会占用较高的资源。

    校验提示文案

    提交
    是的,疏忽记录了这个,实际测试过程中如果不是直通的话跑满带宽的话基本不超过10%,如果使用虚拟网卡,direct模式下占用最高65%,普通虚拟网卡的话virtio是45%~55%之间,感觉这次做的不够完善,之后会改进

    校验提示文案

    提交
    收起所有回复
  • 硬核,留着晚点慢慢看。

    校验提示文案

    提交
    排版不是特别好, [害羞]

    校验提示文案

    提交
    收起所有回复
  • 直通是最最低利用率的用法,你从结果都可以看到速度基本没啥差异,虚拟交换机基本满足使用需求了,如果进阶就sriov,一个网卡多个虚拟机使用利用率高。

    校验提示文案

    提交
    网卡不支持啊,没的测试,无奈

    校验提示文案

    提交
    收起所有回复
  • 最近搞Windows hyperv直通,搞不定啊,明明开了sriov,系统也显示,就是开启不了

    校验提示文案

    提交
    hyper-v应该比较简单吧,只要硬件支持就行,最好用server系统来搞

    校验提示文案

    提交
    不行,我试过了,用的就是server,无法开启直通。

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 道理我都懂 但是这个板哪里能买得到呢

    校验提示文案

    提交
    某宝和某鱼上搜索处理器型号就行

    校验提示文案

    提交
    早已绝版 价格上天

    校验提示文案

    提交
    收起所有回复
  • 现在后悔当初咸鱼便宜出了,现在集成CPU的板子价格上天了啊

    校验提示文案

    提交
    过去好像更贵吧,现在反而便宜很多了

    校验提示文案

    提交
    收起所有回复
  • 什么值得买的markdown还没玩溜,这篇文章排版有点崩,有点丢脸~

    校验提示文案

    提交
  • 辛苦了,虽然看不懂。但是知道直通还是很棒

    校验提示文案

    提交
  • 感谢分享。。

    校验提示文案

    提交
  • 有没有考虑直接在主机上安装进行测试?

    校验提示文案

    提交
  • 大神,值得分享

    校验提示文案

    提交
  • 哈哈官方地方喝酒

    校验提示文案

    提交
  • 写得好,能认识下不?

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
188
扫一下,分享更方便,购买更轻松