KVM Vcpu概述
- Intel VT
- SMP系统
- CPU过载使用
- CPU模型
- CPU绑定和亲和性
- CPU优化
Intel VT
Intel的硬件虚拟化技术大致分为3类:
1、VT-x技术:是指Intel处理器中的一些虚拟化技术支持,包括CPU中最基础的VMX技术,也包括内存虚拟化的硬件支持EPT、VPID等。
2、VT-d技术:是指Intel的芯片组的虚拟化技术支持,通过Intel IOMMU可实现对设备直接分配的支持。
3、VT-c技术:是指Intel的I/O设备相关的虚拟化技术支持,主要包含两个技术:一个是借助虚拟机设备队列(VMDq)最大限度提高I/O吞吐率,VMDq由Intel网卡中的专用硬件来完成;另一个是借助虚拟机直接互连(VMDc)大幅提升虚拟化性能,VMDc主要就是基于SR-IOV标准将单个Intel网卡产生多个VF设备,用来直接分配给客户机。
注:
在x86-64架构的处理器中,KVM需要的硬件虚拟化扩展分别为Intel的虚拟化技术(Intel VT)和AMD的AMD-V技术。
# 查看cpu是否开启VT,flags字段将会记录
[root@node ~]# grep -E "svm|vmx" /proc/cpuinfo
在 BIOS中,VT的选项通过“Advanced > Processor Configuration”来查看和设置,它的标识通常为“Intel® Virtualization Technology”或“Intel VT”等类似的文字说明。
除了支持必需的处理器虚拟化扩展以外,如果服务器芯片还支持 VT-d (VirtualizationTechnology for Directed I/O),建议在 BIOS 中将其打开,因为后面一些相对高级的设备的直接分配功能会需要硬件 VT-d 技术的支持。VT-d是对设备I/O 的虚拟化硬件支持,在BIOS中的位置可能为“Adanced > Processor Confguration”或“Advanced > System Agent(SA) Configuration”,它在 BIOS 中的标志一般为“ Intel® VT for Directed I/O”或“Intel VT-d”。
SMP系统
SMP(Symmetric multiprocessing)对称多处理器系统,是一种多处理器的电脑硬件架构,指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。多个进程可以并行执行,而且单个进程的多个线程也可以得到并行执行。
QEMU在给客户机模拟CPU时,也提供对SMP系统的支持。配置客户机SMP参数如下:
-smp [cpus=] n [,maxcpus=cpus] [, cores=cores] [, threads=threads] [ , sockets=sockets)
n:用于设置客户机中使用的逻辑 CPU 数量(默认值是 1)。
maxcpus:用于设置客户机中最大可能被使用的CPU数量,包括启动时处于下线(ofline)状态的 CPU数量 (可用于热插拔 hot-plug 加人 CPU,但不能超过 maxcpus这个上限)。
cores:用于设置每个 CPU 的 core 数量(默认值是 1)。
threads:用于设置每个 core 上的线程数(默认值是 1)。
sockets:用于设置客户机中看到的总的 CPU socket 数量。
# 查看是否支持SMP系统
[root@node ~]# uname -v
#1 SMP Tue Oct 17 15:42:21 UTC 2023
# 开启irqbalance服务,该服务能够把压力均匀的分配到各个CPU核心上,对提升性能有很大的帮助,但在某些情况下,可能会导致网络、IO等性能问题。
[root@node ~]# service irqbalance start
CPU过载使用
KVM允许客户机过载使用物理资源,即允许为客户机分配多余物理上实际存在的cpu和内存数量。但在实际使用过程中,不推荐让某一个客户机的vCPU数量超过物理系统上存在的CPU数量。比如:在拥有4个逻辑CPU的宿主机中,每个客户机的vCPU数量多于4个。
CPU模型
每一种虚拟机管理程序 ( Virtual Machine Monitor,简称 VMM或Hypervisor)都会定义自己的策略,让客户机看起来有一个默认的 CPU 类型。有的 Hypervisor 会简单地将宿主机中CPU的类型和特性直接传递给客户机使用,而 QEMU/KVM 在默认情况下会向客户机提供一个名为qemu64 或qemu32 的基本 CPU模型。QEMU/KVM 的这种策略会带来一些好处,如可以对CPU 特性提供一些高级的过滤功能,还可以将物理平台根据提供的基本 CPU模型进行分组(如将几台 IvyBridge 和 Sandybridge 硬件平台分为一组,都提供相互兼容的SandyBridge 或qemu64的CPU模型),从而使客户机在同一组硬件平台上的动态迁移更加平滑和安全。
通过如下的命令行可以查看当前的 QEMU 支持的所有 CPU 模型。
# 查看当前的 QEMU 支持的所有 CPU 模型
[root@node -]# qemu-system-x86 64 -cpu ?
# 指定使用Broadwell模型
[root@node -]# qemu-system-x86 rhel7.img -cpu Broadwell -smp 8 -m 16G -enable-kvm
# -enable-kvm 这个参数用来开启KVM硬件加速功能
CPU绑定和亲和性
通常在SMP系统中,Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行。那么在不同的时间片上,进程的执行可能会在不同的CPU上运行,这样就会带来缓存命中失效,导致性能下降。但从另一方面来看,设置CPU亲和性之后,由于进程的运行固定到某个CPU上,会破坏各CPU的负载均衡,SMP的调度效率也会有所降低。
# 可以先查看QEMU pid和psr(运行在几号CPU上)
[root@node ~]# ps -eLo psr,ruser,pid,args | grep qemu
# 上面命令带参数不易记的话,也可以先ps查pid,然后pidstat -p 进程号,查运行CPU号
# 然后将进程绑定到指定CPU上,这里指定3号CPU
[root@node -]# taskset -pc 3 72260
CPU优化
AVX/AVX2/AVX512(Advanced Vector Extensions,高级矢量扩展)指令集。
XSAVE指令集,用于保存和恢复处理器扩展状态,动态迁移保存处理器状态,然后在迁移后恢复处理器的执行状态。
AES(Advanced Encryption Standard,高级加密标准)指令集,用于对电子数据进行加密。
注:
以上不作太多解释,具体可以参考相关资料。
# 查看CPU是否支持
[root@node ~]# cat /proc/cpuinfo | grep -E "avx|xsave|aes"
创建客户机时可以使用 “-cpu qemu64,+aes” 来添加新特性。也可以通过 “-cpu host” 参数来完全暴露宿主机的CPU特性,