深度实践KVM
KVM介绍
KVM历史
KVM必须在即被intel VT,AMD-V功能的X86平台上运行。在kernel 3.9版本中加入了对ARM架构的支持
KVM包含可加载的核心模块kvm.ko,使用QEMU作为虚拟机上层控制工具。
KVM的架构
一台虚拟机就是一个普通的linux进程
通过libvirt来完成对KVM虚拟机的管理
QEMU与KVM
QEMU是一个开源项目,是一台硬件模拟器
利用光盘中的images下的pxe内核文件的kickstart来批量安装系统
3 CPU,内存虚拟化技术与应用场景
3.1 NUMA技术与应用
NUMA是一种解决多cpu共同工作的技术方案
- SMP技术(Symmetrical Multi-Processing):多个CPU通过一个总线访问存储器
- MMP技术:分布式存储器模式
- NUMA技术(Non Uniform Memory Access Architecture):NUMA即非一致访问分布共享存储技术,它是由若干通过高速专用网络连接起来的独立节点构成的系统,各个节点可以是单个的CPU或是SMP系统。
KVM虚拟机NUMA调优
相关命令 numactl numastat
linux系统默认是自动NUMA平衡,可以有以下命令关闭或开启echo 0|1 >/proc/sys/kernel/numa_balancing
CPU绑定操作方法
使用vcpuinfo查看虚拟机vcpu和物理cpu的对应关系
原理:Libvirt通过CGroup来实现的
cpu绑定技术适用于以下场景:
-
系统的cpu压力比较大
-
多核cpu压力不平衡,可以通过cpu pinning技术人工进行调配
一个人虚拟机默认只能使用同一颗物理cpu内部的逻辑核
让虚拟机只能在部分物理cpu之间调度
emulatorpin命令可以查看虚拟机可以使用哪些物理逻辑cpu和让虚拟机只能在部分cpu之间调度
<cputune>
<emulatorpin cpuset='26-32'>
<\cputune>
强制vcpu和物理机cpu一对一绑定
virsh vcpupin
<cputune>
<vcpupin vcpu='a' cpuset='b'/>
</cputune>
3.2 CPU热添加与应用
现仅支持热添加,不能热移除
3.2.1linux系统的cpu热添加
virsh setvcpus domain X --live
#开启关闭cpu
echo 0|1 >/sys/devices/system/cpu/cpux/online
3.3 CPU host-passthrough 技术与应用
/usr/share/libvirt/cpu_map.xml中可以查看libvirt’对cpu的标准类型
<cpu mode='<parameter>'/>
cpu匹配模式可以有以下几种:
- custom模式
- host_model模式:根据物理Cpu的特性,选择一个最靠近的标准cpu型号
- host-passthrough模式:直接将物理cpu暴露给虚拟机使用
3.4 cpu Nested技术与配置方法
虚拟机上运行虚拟机
Nested技术的配置方法:
- 打开KVM内核模块的Nested特性
rmmode kvm-intel
modprob kvm-intel nested=1
- 第一层的虚拟机配置文件使用host-passthrough技术
- 将第一层虚拟机按照宿主机配置,安装相应组件,然后就可以安装第二层虚拟机了
3.5 KSM技术与应用
KSM(kernel Samepage merging)技术:相同的内存分页进行合并。
阻止个别虚拟机进行内存压缩的方法:
<memoryBacking>
<nosharepages/>
</memoryBacking>
/sys/kernel/mm/ksm/中可以看到KSM运行情况
可能会导致两个结果:
- 消耗一定的计算机资源用于内存扫描
- 内存不足时频繁的使用swap交互,导致虚拟机性能下降
3.6 内存气球技术
KVM的内存气球技术可以在虚拟机之间按照需要调节内存大小,提高内存的利用率
需要安装virt balloon驱动,内核开启CONFIG_VIRTIO_BALLOON
<memballoon model='virtio'>
<alias name='balloon0'/>
</memballoon>
//限制内存大小为size
virsh qemu-monitor-command domain --hmp --cmd balloon size
//查看当前内存大小
virsh qemu-monitor-command domain --hmp --cmd info balloon
3.7 内存限制技术
virsh memtune <domain> --[parameter] size
parameter:
- hard_limit:虚拟机可以使用的最大内存 单位kb
- soft_limit:竞争时的内存
- swap_hard_limit:最大内存加swap
- min_guarantee:最低保证给虚拟机使用的内存
<memtune>
<parameter unit='KiB'>size</parameter>
</memtune>
限制虚拟机对宿主机swap的使用
<!--设置locked参数,必须在memtune块中设置hard_limit-->
<memoryBacking>
<locked/>
</memoryBacking>
3.8 巨型页内存技术
X86默认的内存大小是4KB,但是也可以使用2MB或者1GB的巨型页
对于生产环境的CentOS 6,7 的宿主机默认是打开透明巨型页并且是自动调整的
4 网络虚拟化技术
一个完整的数据包从虚拟机到物理机的路径:虚拟机,QEMU虚拟网卡,虚拟化层,内核网桥,物理网卡
4.1 把虚拟化网卡
virtio驱动因为改造了虚拟机操作系统,让虚拟机可以直接与虚拟化层通信,从而大大提高了虚拟机的性能
<!--默认是8139的全虚拟化网卡-->
<!--指定使用virtio网卡-->
<model type='virtio'/>
<!--指定使用全虚拟化网卡-->
<model type='e1000'/>
-
半虚拟化是全虚拟化吞吐量的两倍
-
CentOS半虚拟化性能是windows的三倍左右
比较老的linux,为了兼容性,推荐使用全虚拟化
4.2 MacVTap和vhost-net技术
MacVTap
MacVTap:给同一个物理网卡配置多个MAC地址,这样就可以在软件上配置多个以太网口。
支持新的虚拟化技术,可以将宿主机CPU的一些工作交给网络设备
macvtap有三种工作模式:
-
VEPA:同一个物理网卡下的MacVTap设备之间的流量也要发送到外部网络交换机,再发回服务器
-
Bridge:同一个物理网卡下的MacVTap设备可以直接进行以太网帧的交换
-
Private:同一个物理网卡下的MacVTap设备无法进行交互
目前MacVTap在windows虚拟机中性能不佳,不建议使用
vhost_net
运行一台虚拟机是由用户态的QEMU与内核的KVM共同完成。需要频繁切换cpu状态,所以加入一个人vhost_net的内核驱动来代替QEMU,内核中实现virtio的后段处理。
libvirt默认配置是vhost_net
<interface type='bridge'>
.....
<diviver name='vhost'/>
.....
</interface>
4.3 网卡的中断与多队列
RSS (Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的网卡驱动技术。
- 网卡对接收到的报文进行解析,获取IP地址、协议和端口五元组信息
- 网卡通过配置的HASH函数根据五元组信息计算出HASH值,也可以根据二、三或四元组进行计算。
- 取HASH值的低几位(这个具体网卡可能不同)作为RETA(redirection table)的索引
- 根据RETA中存储的值分发到对应的CPU
基于RSS技术程序可以通过硬件在多个CPU之间来分发数据流,并且可以通过对RETA的修改来实现动态的负载均衡。
CentOS中依靠irqbalance服务优化中断分配。
- performance mode:尽可能的均匀分发给个个CPU core
- Power-save mode:集中分配给第一个CPU
网卡绑定中断的脚本github地址
RSS需要网卡硬件支持,在不支持的网卡中使用使用RPS,RFS:
- RPS(Receive Packet Steering):把一个rx队列中的软中断分发给多个CPU
- RFS(receive flow steering):不仅考虑HASH,考虑应用程序的位置来控制数据包
检测内核是否支持多队列
grep IFF_MULTI_QUEUE /usr/include/linux/if_tun.h
多队列virtio网卡配置
<interface>
.....
<deviver name='vhost' queue='N'/>
<!--1<=N<8-->
.....
</interface>
虚拟机上执行以下命令开启
ethtool -L eth0 combined M
#M<=N
小包转发上性能还不理想,不建议在生产环境中使用
4.4 网卡PCI Passthrough
配置方法:
1)查看网卡设备信息
lspci | grep Ethernet
#06:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
#06:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
2)得到xml配置信息
virsh nodedev-dumpxml pci_0000_06_00_0
#获得Domain,bus,slot,function信息用于下一步
3)编辑虚拟机xml文件
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0' bus='0x0' slot='0x19' function='0x0'/>
</source>
</hostdev>
4.5 SR-IOV虚拟化技术
the single root IO virtualization:将一个PCI-E设备共享给虚拟机使用的标准
4.6 OpenvSwitch
相比传统的桥接方式,OpenvSwitch具有更高的灵活性
4.7 多网卡绑定与建桥
在生产环境中,通过多网卡绑定,可以提高可靠性和带宽