KVM必须在即被intel VT,AMD-V功能的X86平台上运行。在kernel 3.9版本中加入了对ARM架构的支持
KVM包含可加载的核心模块kvm.ko,使用QEMU作为虚拟机上层控制工具。
一台虚拟机就是一个普通的linux进程
通过libvirt来完成对KVM虚拟机的管理
QEMU是一个开源项目,是一台硬件模拟器
利用光盘中的images下的pxe内核文件的kickstart来批量安装系统
NUMA是一种解决多cpu共同工作的技术方案
相关命令 numactl numastat
linux系统默认是自动NUMA平衡,可以有以下命令关闭或开启echo 0|1 >/proc/sys/kernel/numa_balancing
使用vcpuinfo查看虚拟机vcpu和物理cpu的对应关系
原理:Libvirt通过CGroup来实现的
cpu绑定技术适用于以下场景:
系统的cpu压力比较大
多核cpu压力不平衡,可以通过cpu pinning技术人工进行调配
一个人虚拟机默认只能使用同一颗物理cpu内部的逻辑核
emulatorpin命令可以查看虚拟机可以使用哪些物理逻辑cpu和让虚拟机只能在部分cpu之间调度
<cputune>
<emulatorpin cpuset='26-32'>
<\cputune>
virsh vcpupin
<cputune>
<vcpupin vcpu='a' cpuset='b'/>
cputune>
现仅支持热添加,不能热移除
virsh setvcpus domain X --live
#开启关闭cpu
echo 0|1 >/sys/devices/system/cpu/cpux/online
/usr/share/libvirt/cpu_map.xml中可以查看libvirt’对cpu的标准类型
<cpu mode='' />
cpu匹配模式可以有以下几种:
虚拟机上运行虚拟机
Nested技术的配置方法:
rmmode kvm-intel
modprob kvm-intel nested=1
KSM(kernel Samepage merging)技术:相同的内存分页进行合并。
阻止个别虚拟机进行内存压缩的方法:
<memoryBacking>
<nosharepages/>
memoryBacking>
/sys/kernel/mm/ksm/中可以看到KSM运行情况
可能会导致两个结果:
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
virsh memtune <domain> --[parameter] size
parameter:
<memtune>
<parameter unit='KiB'>sizeparameter>
memtune>
限制虚拟机对宿主机swap的使用
<memoryBacking>
<locked/>
memoryBacking>
X86默认的内存大小是4KB,但是也可以使用2MB或者1GB的巨型页
对于生产环境的CentOS 6,7 的宿主机默认是打开透明巨型页并且是自动调整的
一个完整的数据包从虚拟机到物理机的路径:虚拟机,QEMU虚拟网卡,虚拟化层,内核网桥,物理网卡
virtio驱动因为改造了虚拟机操作系统,让虚拟机可以直接与虚拟化层通信,从而大大提高了虚拟机的性能
<model type='virtio'/>
<model type='e1000'/>
半虚拟化是全虚拟化吞吐量的两倍
CentOS半虚拟化性能是windows的三倍左右
比较老的linux,为了兼容性,推荐使用全虚拟化
MacVTap:给同一个物理网卡配置多个MAC地址,这样就可以在软件上配置多个以太网口。
支持新的虚拟化技术,可以将宿主机CPU的一些工作交给网络设备
macvtap有三种工作模式:
VEPA:同一个物理网卡下的MacVTap设备之间的流量也要发送到外部网络交换机,再发回服务器
Bridge:同一个物理网卡下的MacVTap设备可以直接进行以太网帧的交换
Private:同一个物理网卡下的MacVTap设备无法进行交互
目前MacVTap在windows虚拟机中性能不佳,不建议使用
运行一台虚拟机是由用户态的QEMU与内核的KVM共同完成。需要频繁切换cpu状态,所以加入一个人vhost_net的内核驱动来代替QEMU,内核中实现virtio的后段处理。
libvirt默认配置是vhost_net
<interface type='bridge'>
.....
<diviver name='vhost'/>
.....
interface>
RSS (Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的网卡驱动技术。
基于RSS技术程序可以通过硬件在多个CPU之间来分发数据流,并且可以通过对RETA的修改来实现动态的负载均衡。
CentOS中依靠irqbalance服务优化中断分配。
RSS需要网卡硬件支持,在不支持的网卡中使用使用RPS,RFS:
检测内核是否支持多队列
grep IFF_MULTI_QUEUE /usr/include/linux/if_tun.h
多队列virtio网卡配置
<interface>
.....
<deviver name='vhost' queue='N'/>
.....
interface>
虚拟机上执行以下命令开启
ethtool -L eth0 combined M
#M<=N
小包转发上性能还不理想,不建议在生产环境中使用
配置方法:
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>
the single root IO virtualization:将一个PCI-E设备共享给虚拟机使用的标准
相比传统的桥接方式,OpenvSwitch具有更高的灵活性
在生产环境中,通过多网卡绑定,可以提高可靠性和带宽