网络虚拟化技术
数据包从虚拟机到物理机过程:
虚拟机 -> QEMU虚拟网卡 -> 虚拟化层 -> 内核网桥 -> 物理网卡
半虚拟化技术使数据包跳过QEMU虚拟网卡,从虚拟机直接到虚拟化层,
虚拟网卡性能排序:
半虚拟化网卡(virtio) > 全虚拟化网卡(e1000,rtl8139)
MacVTap 和vhost-net技术
- MacVTap跳过内核网桥
- vhost-net跳过虚拟化层
使用vhost_net,必须使用Virtio半虚拟化网卡
MacVTap技术
简化虚拟化环境中的交换网络,代替传统的Linux TAP设备加Bridge设备组合
MacVTap设备有3中不同的工作模式:
- VEPA
同一物理网卡下的MacVTap设备之间的流量要发送到外部交换机,再由外部交换机转发回来,前提是交换机支持hairpin模式 - Bridge
类似传统的Linux Bridge,同一物理网卡下的MacVTap设备可以一直接通信 - Private
同一物理网卡下的MacVTap设备互相无法联通
创建MacVTap端口过程
ip link add link eth0 name MacVTap0 type MacVTap
ip link set MacVTap0 address 1a:in:in:ij:fa:sd up
ip link show MacVTap0
KVM虚拟机使用MacVTap网络
在xml文件配置如下
<interface type='direct'>
<mac address='la:46:0b:ca:bc:7b'/>
<source dev='eth0' mode='bridge' />
<model type='e1000' />
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface >
虚拟机开启后,宿主系统会自动创建一台MacVTap设备给虚拟机使用,这台MacVTap设备附属于母设备eth0,工作模式为Bridge
vhost_net技术
运行一台虚拟机是由用户空间的 QEMU 和内核的 KVM 共同完成的, QEMU 负责模拟各种设备提供给虚拟机, KVM 负责完成 CPU 和内存的虚拟化。 Virtio 的后端处理程序一般是由用户空间的 QEMU 提供的。 为了进一步减少延迟、提高性能, 比较新的内核中增加了一个 vhost_net 的驱动模块, 在内核中实现了 Virtio 的后端处理程序。
xml文件配置
<interface type='bridge'>
<mac address=''/>
<source bridge='br0' />
<model type='Virtio'/>
<driver name="vhost"/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface >
网卡中断与多队列
1.物理网卡的中断与多队列
RSS 是网卡的硬件特性, 实现多队列, 将不同的流分发到不同的CPU上, 同一数据流始终在同一CPU 上, 避免 TCP的顺序性和 CPU 的并行性发生冲突。基于流的负载均衡, 解决了顺序协议和CPU并行的冲突及Cache热度问题。
查看网卡是否支持RSS:
ls /sys/class/net/eth0/queues/
2.绑定中断
CentOS系统中依靠 irqbalance服务优化中断分配,irqbalance服务用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于Performance mode 或 Power-save mode。
- 处于Performance mode 时,irqb alance 会将中断尽可能均匀地分发给各个 CPU core,以充分利用CPU 多核, 提升性能。
- 处于Power-save mode 时,irqbalance会将中断集中分配给第一个CPU, 以保证其他空闲 CPU 的睡眠时间,降低能耗。
irqbalance服务在大压力情况下,尤其是万兆网卡上,有中断漂移及分配不平均的现象。如果压力比较大,可以手工调整系统的网卡中断。
3.多队列Virtio网卡
查看是否支持:
grep IFF_MULTL_QUEUE /usr/include/Linux/if_tun.h
多队列Virtio网卡配置:
<interface type='bridge'>
<mac address='52:54:00:43:6e:3f'/>
<source bridge='clients' />
<model type='Virtio' />
<driver name='vhost' queues= 'N' />
<address type='pci' domain='0x0000' bus='0x0000' solt='0x0000' function='0x0' />
</interface>
N 1-8最多支持8个队列,在虚拟机上执行以下命令开启多队列网卡:
ethtool -L eth0 combined M
M 1-N,M小于等于N
网卡 PCI Passthrough 技术
如果虚拟机对网络的要求非常高, 通过 PCI Passthrough 技术将物理网卡直接给虚拟机使用, 虚拟机将单独使用网卡, 可以达到几乎和物理网卡一样的性能。
PCI Passthrough跳过QEMU虚拟网卡,虚拟化层,内核网桥,直接让虚拟机与物理网卡连接
PCI Passthrough配置
1.查看网卡设备信息:
lspci
或者virsh nodedev-list --tree
+- pci_0000_00_11_0
| |
| +- pci_0000_02_00_0
| | |
| | +- net_ens32_00_0c_29_c2_6d_e4
| |
| +- pci_0000_02_01_0
| |
| +- net_ens33_00_0c_29_c2_6d_ee
2.得到pci_0000_02_00_0的配置信息
virsh nodedev-dumpxml pci_0000_02_00_0
<device>
<name>pci_0000_02_00_0</name>
<path>/sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0</path>
<parent>pci_0000_00_11_0</parent>
<driver>
<name>e1000</name>
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>2</bus>
<slot>0</slot>
<function>0</function>
<product id='0x100f'>82545EM Gigabit Ethernet Controller (Copper)</product>
<vendor id='0x8086'>Intel Corporation</vendor>
</capability>
</device>
3.编辑虚拟机xml文件,加入PCI设备信息
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</source>
</hostdev>
SR-IOV虚拟化技术
SR-IOV (Single Root I/O Virtualization)是一个 PCI 快捷标准,把单一物理 PCI 功能扩展到同分散的虚拟化功能(VF)一样共享 PCI 资源。通过 PCI 设备分配,每个功能可以被不同虚拟机使用。
SR-IOV 上有两个功能类型。
- Physical Functions (PFs): 拥有全功能PCI-E 功能,用于配置管理SR-IOV。
- Virtual Functions (VFs) : 只有轻量级的 PCI-E 功能,只包含数据传输必要的资源, 但是资源可以 非常细致地配置, 每个 PF 最多可有 64 000 个与其关联的虚拟功能(Virtual Function, VF) 。
SR- IOV 标准允许高效共享PCI-E 设备, 有以下优点:
- 良好的性能, 虚拟机绕过虚拟化层和系统, 直接访问硬件, 没有虚拟化层软件模拟的开销。
- 降低成本, 减少了设备数量, 例如网卡的SR-IOV减少了网卡数量、交换机端口、网线。
2.网卡S R-IO V 的配置
SR-IOV 的配置需要先配置宿主机 PF , 然后将子网卡通过网卡独占的方式供虚拟机使用。
(1) 加载SR-IOV 内核模块
通过modprobe 命令加载igb 模块。
modprobe igb
实际加载的时候,需要激活虚拟功能(VF)。
modprobe igb max_vfs=7
千兆网卡最多 支持 8 个 VF ( 0 - 7 )。千兆网卡目前支待比较好的是Intel I350, Intel82576 虽然也支持SR-IOV, 但是只支持虚拟机是Linux 系统, Windows 系统不支持。
万兆网卡最多支持64 个 VF (0 - 63), Intel 的新一代万兆网卡 X520 ( 82599 )、X540都支持SR-IOV技术。
如果是主板集成的网卡 ,一 般在 BIOS 中 SR-IOV功能是关闭的。如果要使用 , 需要在 BIOS 中打开 SR-IOV选项。
如果需要重新设置VF, 可以删除模块再重新加载。
modprobe -r igb
将配置永久写入配置文件。
echo "options igb max_vfs=7" >> /etc/modprobe.d/igb.c onf
通过 lspci 命令可以看多主网卡和子网卡。
(2) 子网卡的使用
虚拟机可以通过网卡独占的方式使用子网卡。
virsh nodedev-list |grep 0b
虚拟机网卡xml 配置文件如下:
<interface type='hostdev' managed='yes'>
<source>
<address type='pci' domain='0' bus='11' slot='16' function='0'/>
</source>
</interface>
虚拟机需要安装网卡驱动才能 使用子网卡,高版本的Linux系统可以自动识别子网卡,
Windows系统只能是2008 Sevrer 以上版本,并且要安装最新的 Intel网卡驱动。
网友评论