MacVTap和vhost-net技术原理
VM <----> 虚拟网卡 <----> 虚拟化层 <----> 内核网桥 <----> 物理网卡
vhost-net技术使虚拟机的网络通信绕过用户空间的虚拟化层,必须使用Virtio半虚拟化的网卡
MacVTap则是跳过内核的网桥
传统桥接方案
<interface type=‘bridge‘>
<mac address=‘00:16:42:34:45:6f‘/>
<source bridge=‘br0‘/>
<targetdev=‘tap0‘/>
<model type=‘Virtio‘/>
<alias name=‘net0‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
</interface>
vhost-net是对于Vritio的优化,Virtio本来是设计用于进行客户系统的前端与VMM的后端通信,减少硬件虚拟化方式下根模式和非根模式的转换
vhost-net是后端优化方案.
不使用vhost-net,进入CPU的根模式后,需要进入用户态将数据发送到tap设备后,再次切入内核态,使用vhost-net方式后,进入内核态后不需要再进行内核态和用户态的切换,进一步减少特权级切换的开销.
MacVTap方案
> ip link add link eth1 name MacVTap0 type MacVTap
> ip link set MacVTap0 address 1a:34:34:34:45:42 up
> ip link show MacVTap0
<interface type=‘direct‘>
<mac address=‘1a:343434:45:42‘/>
<source dev=‘eth1‘ mode=‘bridge‘/>
<model type=‘e1000‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
</interface>
网卡的中断与多队列
Linux内核调用中断处理程序的函数来处理中断,由于中断会频繁发生,必须要将一些繁重且不非常重要的任务从中断处理程序中剥离出来,这一部分在Linux称为下半部
3中处理下半部的方法
软中断
tasklet
工作队列
高负载的网卡是软中断产生的大户,很容易形成瓶颈.并且在相当长的时间里是CPU0来处理
网卡多队列 网卡的数据请求通过多个CPU来处理
RSS是硬件特性,实现多队列,将 不同的流发到不同的CPU上, 同一数据流始终在同一个CPU上, 避免CPU的并行性和TCP的顺序性发生冲突.
ls /sys/class/net/eth0/queues/
会看到系统中看到网卡对应多个发送和接收队列
irqbalance 优化中断分配
工作模式
performance
power-save
https://gist.github.com/syuu1228/4352382 网卡绑定中断的脚本
多队列Virtio网卡
网卡PCI PassThrough技术
> virsh nodedev -list -tree
> virsh nodedev-dumpxml.pci_0000_04_00_0
SR-IOV技术
the Single Root I/O Virtualization 是一个将PCI-E设备共享给虚拟机使用的标准.多用在网络设备上,理论上也可以支持其他的PCI设备
SR-IOV技术是一种硬件解决方案,提供了一种从硬件上绕过系统的虚拟化层,并且使没有虚拟机能有单独的内存地址,中断,DMA流
PFs physical functions 拥有全功能PCI-E
VFs Virtual Functions 只有轻量级的PCI-E 每个PF最多可以有64000个虚拟功能VF
网卡SR-IOV
需要先配置宿主机的PF,然后将子网卡通过网卡独占的方式供虚拟机使用.
modprobe igb
modprobe igb max_vfs=7
千兆网卡最多支持8个VF(0-7)
万兆网卡最多支持64个VF
BIOS打开SR-IOV
modprobe -r igb
echo "option igb max_vfs=7" >> /etc/modprobe.d/igb.conf
lspci |grep 82576
虚拟机使用网卡独占的方式使用子网卡
virsh nodedev-list|grep 0b
Open vSwitch
> ovs-vsctl add-br br0 #创建网桥
> ovs-vsctl add-port br0 eth1
编辑虚拟机文件
<interface type=‘bridge‘>
<mac address=‘xx:xx:xx:xx:xx:xx‘ />
<source bridge=‘br0‘/>
<virtualport type=‘KVM‘/>
<vlan>
<tag id=‘2‘/>
</vlan>
<targetdev=‘tap1‘/>
<model type=‘Virtio‘/>
</interface>
ovs-vsctl show
>ovs-vsctl set port tap1 tag=3 通过改变虚拟机对应的tap网卡设置VLAN tag即可
ovs-vsctl add-br br0
ovs-vsctl add-bond br0 bond0 eth2 eth3 lacp=active
ovs-vsctl set port bond0 bond_mode=balance-slb
ovs-appctl bond/show bond0
连接网格open vSwitch网桥
1.利用VETH设备
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ip link add name veth0 type veth peer name veth1
ovs-vsctl add-port br0 veth0
ovs-vsctl add-port br1 veth1
2.利用Open vSwitch的pacth类型的端口
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl add-port br0 patch-to-br0
ovs-vsctl set interface patch-to-br0 type=patch
ovs-vsctl set interface patch-to-br0 options:peer=patch-to-br1
ovs-vsctl add-port br1 patch-to-br1
ovs-vsctl set interface patch-to-br1 type=patch
ovs-vsctl set interface patch-to-br1 options:peer=patch-to-br0
宿主机多网卡绑定
cat /etc/modprobe.d/nicbond.conf
alias bond0 bonding
options bond0 mode=1 miimon=100
配置聚合接口
cd /etc/sysconfig/network-scripts
cat ifcfg-bond0
DEVICE=bond0
ONBOOT=YES
BRIDGE=br1
配置子网卡
cat ifcfg-enp4s0f0
HWADDR=
TYPE=Ethernet
BOOTPROTO=none
NAME=enp4s0f0
UUID=
ONBOOT=yes
MASTER=bond0
SLAVE=yes
配置虚拟网桥
cat ifcfg-br1
DEVICE=br1
TYPE=Bridge
IPADDR=192.168.20.200
NETMASK=255.255.255.0
ONBOOT=yes
内容从<深度实践KVM>一书总结