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这个坑,当然,这个测试一点都不严谨,影响速度的因素还有很多,希望有经验的大佬能分享一下心得……

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

展开 收起

Lenovo 联想 个人云A1 nas网络云存储 2G内存 内置4T西数红盘

Lenovo 联想 个人云A1 nas网络云存储 2G内存 内置4T西数红盘

1019元起

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘 X1 4G五盘位+配2块西部数据4TB

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘 X1 4G五盘位+配2块西部数据4TB

暂无报价

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘

暂无报价

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘 T2 敦煌版 +配2块4TB硬盘

联想个人云T2 网络存储服务器nas 四核CPU+2G内存 私有云 网盘企业硬盘 T2 敦煌版 +配2块4TB硬盘

2399元起

UGREEN 绿联 DX4600 Pro 4盘位NAS(奔腾N6005、8GB)

UGREEN 绿联 DX4600 Pro 4盘位NAS(奔腾N6005、8GB)

1899元起

ZSpace 极空间 私有云 Z4Pro 8G版 4盘位NAS存储(N97、8GB)

ZSpace 极空间 私有云 Z4Pro 8G版 4盘位NAS存储(N97、8GB)

2499元起

UGREEN 绿联 DX4600 四盘位NAS存储 (赛扬N5105、8GB)

UGREEN 绿联 DX4600 四盘位NAS存储 (赛扬N5105、8GB)

1749元起

ZSpace 极空间 私有云 Z4Pro 性能版 NAS存储(N305、16GB)

ZSpace 极空间 私有云 Z4Pro 性能版 NAS存储(N305、16GB)

3499元起

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

2699元起

ZSpace 极空间 私有云 Z4Pro 16G版 4盘位NAS存储(N97、16GB)

ZSpace 极空间 私有云 Z4Pro 16G版 4盘位NAS存储(N97、16GB)

2799元起

Synology 群晖 DS224+ 双盘位NAS(赛扬J4125、2GB)

Synology 群晖 DS224+ 双盘位NAS(赛扬J4125、2GB)

2849元起

ZSpace 极空间 私有云 Z423 旗舰版 8盘位NAS存储(锐龙R7-5825U、64GB)

ZSpace 极空间 私有云 Z423 旗舰版 8盘位NAS存储(锐龙R7-5825U、64GB)

5899元起

UGREEN 绿联 DX4600+ 4盘位NAS(赛扬N5105、8GB)

UGREEN 绿联 DX4600+ 4盘位NAS(赛扬N5105、8GB)

1999元起

ASUS 华硕 AS6702T 4盘位NAS存储 黑色(Core2 Quad Q8300、4GB)

ASUS 华硕 AS6702T 4盘位NAS存储 黑色(Core2 Quad Q8300、4GB)

4299元起

TERRAMASTER 铁威马 F4-424 Pro 四盘位NAS(Intel Core i3、32GB)黑色

TERRAMASTER 铁威马 F4-424 Pro 四盘位NAS(Intel Core i3、32GB)黑色

2499元起

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

3299元起
27评论

  • 精彩
  • 最新
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

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