深度实践KVM学习笔记

深度实践KVM

  • KVM介绍
    • KVM历史
    • KVM的架构
    • QEMU与KVM
  • 3 CPU,内存虚拟化技术与应用场景
    • 3.1 NUMA技术与应用
      • KVM虚拟机NUMA调优
      • CPU绑定操作方法
        • 让虚拟机只能在部分物理cpu之间调度
        • 强制vcpu和物理机cpu一对一绑定
    • 3.2 CPU热添加与应用
      • 3.2.1linux系统的cpu热添加
    • 3.3 CPU host-passthrough 技术与应用
    • 3.4 cpu Nested技术与配置方法
    • 3.5 KSM技术与应用
    • 3.6 内存气球技术
    • 3.7 内存限制技术
    • 3.8 巨型页内存技术
  • 4 网络虚拟化技术
    • 4.1 把虚拟化网卡
    • 4.2 MacVTap和vhost-net技术
      • MacVTap
      • vhost_net
    • 4.3 网卡的中断与多队列
    • 4.4 网卡PCI Passthrough
    • 4.5 SR-IOV虚拟化技术
    • 4.6 OpenvSwitch
    • 4.7 多网卡绑定与建桥

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共同工作的技术方案

  1. SMP技术(Symmetrical Multi-Processing):多个CPU通过一个总线访问存储器
  2. MMP技术:分布式存储器模式
  3. 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=''/>

cpu匹配模式可以有以下几种:

  • custom模式
  • host_model模式:根据物理Cpu的特性,选择一个最靠近的标准cpu型号
  • host-passthrough模式:直接将物理cpu暴露给虚拟机使用

3.4 cpu Nested技术与配置方法

虚拟机上运行虚拟机

Nested技术的配置方法:

  1. 打开KVM内核模块的Nested特性
rmmode kvm-intel
modprob kvm-intel nested=1
  1. 第一层的虚拟机配置文件使用host-passthrough技术
  2. 将第一层虚拟机按照宿主机配置,安装相应组件,然后就可以安装第二层虚拟机了

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'>sizeparameter>
memtune>

限制虚拟机对宿主机swap的使用


<memoryBacking>
	<locked/>
memoryBacking>

3.8 巨型页内存技术

X86默认的内存大小是4KB,但是也可以使用2MB或者1GB的巨型页

对于生产环境的CentOS 6,7 的宿主机默认是打开透明巨型页并且是自动调整的

4 网络虚拟化技术

一个完整的数据包从虚拟机到物理机的路径:虚拟机,QEMU虚拟网卡,虚拟化层,内核网桥,物理网卡

4.1 把虚拟化网卡

virtio驱动因为改造了虚拟机操作系统,让虚拟机可以直接与虚拟化层通信,从而大大提高了虚拟机的性能



<model type='virtio'/>

<model type='e1000'/>

  • 半虚拟化是全虚拟化吞吐量的两倍

  • CentOS半虚拟化性能是windows的三倍左右

      比较老的linux,为了兼容性,推荐使用全虚拟化
    

4.2 MacVTap和vhost-net技术

深度实践KVM学习笔记_第1张图片

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需要网卡硬件支持,在不支持的网卡中使用使用RPSRFS

  • 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'/>
	
	.....
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 多网卡绑定与建桥

在生产环境中,通过多网卡绑定,可以提高可靠性和带宽

你可能感兴趣的:(KVM)