一个完整的数据包从虚拟机到物理机的路径是:
虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理网卡
总的来说,KVM的网络优化方案旨在减少虚拟机访问物理网卡的层数,直至虚拟机能够独占物理网卡,达到与物理机相同的网络性能。
方案一:全虚拟化网卡和virtio
全虚拟化网卡是由虚拟化层完全模拟的网卡,而半虚拟化网卡通过驱动对操作系统进行了改造。virtio的基本理念是告知虚拟机它运行在虚拟化平台上,并通过双方协作提升在虚拟化环境中的性能。
关于virtio的使用场景,由于Windows虚拟机在使用virtio时可能出现网络闪断问题,建议在网络压力较低的情况下使用e1000这样的全虚拟化网卡,而在网络压力较高时,建议使用SR-IOV或PCI设备分配技术。virtio也在不断演进,期望能减少Windows的闪断问题。
KVM天生为Linux系统设计,Linux系统可以放心大胆地使用virtio驱动。
方案二:vhost_net和macvtap技术
vhost_net使虚拟机的网络通信直接绕过用户空间的虚拟化层,与内核直接通信,从而提升虚拟机的网络性能。macvtap则跳过了内核的网桥。
使用vhost_net必须使用virtio半虚拟化网卡。
vhost_net虚拟机的XML文件配置如下:
<interface>
<mac></mac>
<model></model>
<driver></driver>
<address></address>
</interface>如果不使用vhost_net,则配置为:
<driver></driver>
macvtap虚拟机的XML配置如下:
<interface>
<mac></mac>
<model></model>
<address></address>
</interface>注意:macvtap在Windows虚拟机上的性能较差,不建议使用。
vhost_net和macvtap的比较:
macvlan的功能是为同一个物理网卡配置多个MAC地址,从而在软件层面上配置多个以太网口,属于物理层的功能。macvtap是用来替代TUN/TAP和Bridge内核模块的,基于macvlan模块,提供TUN/TAP中tap设备使用的接口。使用macvtap的虚拟机可以通过tap设备接口,直接将数据传递到内核中对应的macvtap以太网口。vhost-net是对virtio的优化,virtio原本设计用于客户系统的前端与VMM的后端通信,减少硬件虚拟化方式下根模式与非根模式的切换。使用vhost-net后,可以进一步减少进入CPU的根模式后,需要进入用户态将数据发送到tap设备后再次切入内核态的开销,而是进入内核态后不需要进行内核态与用户态的切换,进一步减少这种特权级的切换。vhost-net属于进行二层网络数据传递的优化。
方案三:虚拟机网卡独占
网卡passthrough在虚拟机的配置方法:
04:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06) 04:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
也可以使用virsh nodedev-list –tree命令获取信息:
+- pci_0000_00_07_0 | | | +- pci_0000_04_00_0 | | | | | +- net_p1p1_00_1b_21_88_69_dc | | | +- pci_0000_04_00_1 | | | +- net_p1p2_00_1b_21_88_69_dd
[root@]# virsh nodedev-dumpxml pci_0000_04_00_0
<device>
<name>pci_0000_04_00_0</name>
<parent>pci_0000_00_07_0</parent>
<driver>
<name>e1000e</name>
</driver>
<capability>
<domain>0</domain>
<bus>4</bus>
<slot>0</slot>
<function>0</function>
<product>82571EB Gigabit Ethernet Controller</product>
<vendor>Intel Corporation</vendor>
</capability>
</device><hostdev>
<address></address>
</hostdev>Domain、bus、slot、function信息从dumpxml输出的XML文件中获取,定义虚拟机后,启动虚拟机即可。注意,因为附加的是物理设备,需要在系统中安装相应的驱动。
方案四:SR-IOV技术
SR-IOV的原理:SR-IOV是单根I/O虚拟化的简称,是一个将PCIe共享给虚拟机使用的标准,目前主要用于网络设备,理论上也可以支持其他PCI设备,SR-IOV需要硬件支持。
以下内容来自Oracle网站,链接为http://docs.oracle.com/cd/E38902_01/html/E38873/glbzi.html
物理功能(Physical Function, PF)用于支持SR-IOV功能的PCI功能,如SR-IOV规范中定义。PF包含SR-IOV功能结构,用于管理SR-IOV功能。PF是全功能的PCIe功能,可以像其他任何PCIe设备一样进行发现、管理和处理。PF拥有完全配置资源,可以用于配置或控制PCIe设备。虚拟功能(Virtual Function, VF)与物理功能关联的一种功能。VF是一种轻量级PCIe功能,可以与物理功能以及与同一物理功能关联的其他VF共享一个或多个物理资源。VF仅允许拥有用于其自身行为的配置资源。
每个SR-IOV设备都可有一个物理功能(Physical Function, PF),并且每个PF最多可有64,000个与其关联的虚拟功能(Virtual Function, VF)。PF可以通过寄存器创建VF,这些寄存器设计有专用于此目的的属性。
一旦在PF中启用了SR-IOV,就可以通过PF的总线、设备和功能编号(路由ID)访问各个VF的PCI配置空间。每个VF都具有一个PCI内存空间,用于映射其寄存器集。VF设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的PCI设备。创建VF后,可以直接将其指定给IO来宾域或各个应用程序(如裸机平台上的Oracle Solaris Zones)。此功能使得虚拟功能可以共享物理设备,并在没有CPU和虚拟机管理程序软件开销的情况下执行I/O。
SR-IOV的优点:SR-IOV标准允许在IO来宾域之间高效共享PCIe设备。SR-IOV设备可以具有数百个与某个物理功能(Physical Function, PF)关联的虚拟功能(Virtual Function, VF)。VF的创建可由PF通过设计用来开启SR-IOV功能的寄存器以动态方式进行控制。缺省情况下,SR-IOV功能处于禁用状态,PF充当传统PCIe设备。
具有SR-IOV功能的设备可以利用以下优点:
SR-IOV的使用:
启动SR-IOV内核模块:
modprobe igb
激活虚拟功能(VF):
modprobe igb max_vfs=7
千兆网卡最多支持8个VF(0-7),目前支持较好的千兆网卡是INTEL I350,82576S虽然也支持SR-IOV,但仅支持Linux虚拟机,Windows系统不支持。万兆网卡最多支持64个VF(0-63),Intel的新一代万兆网卡如x520、x540等都支持SR-IOV。
如果需要重新设置VF,可以删除模块后重新加载:
modprobe -r igb
将配置永久写入配置文件:
echo "options igb max_vfs=7" >> /etc/modprobe.d/igb.conf
通过lspci命令可以查看主网卡和子网卡:
# lspci | grep 82576 0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
虚拟机可以通过PCI网卡独占的方式使用子网卡。
虚拟机网卡的XML文件配置如下:
<interface>
<address></address>
</interface>方案五:网卡多队列
从CentOS 7开始支持virtio网卡多队列,可以大大提高虚拟机的网络性能,配置方法如下:
虚拟机的XML网卡配置:
<interface>
<model></model>
<driver></driver>
</interface>N 1 - 8,最多支持8个队列。
在虚拟机上执行以下命令开启多队列网卡:
# ethtool -L eth0 combined M
M 1 - N,M小于等于N。
个人认为,KVM网络优化方案应以硬件为主,硬件上万兆+SR-IOV的方案会越来越普及,但线上迁移的问题仍需解决。
以上就是KVM虚拟化网络优化技术总结的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号