kvm模块的基础功能就是,虚化、超配计算机资源,包括:CPU 处理器、Memory 内存、Storage 存储、Network 网络、Display 显示。
1 几个概念
1)在lscpu命令结果中sockets就代表物理CPU个数,CPU(s)就是逻辑CPU(vCPU virtual CPU)个数。核指的就是独立的处理单元,超线程就是指开了几个控制器,控制器能将核分割开,使被分割的部分可以作为独立的控制单元。所以一个计算机的计算能力vCPU=物理CPU数*cores核数*threads线程数。
2)在Vmware里面把虚拟机叫虚拟机,在KVM里面把虚拟机叫domain,在OpenStack里面把虚拟机叫实例。只是叫法不同。
虚拟机在物理机中由2部分构成——XML文件与硬盘文件。
3)vCPU在kvm中的三种进程模式
用户模式 (User Mode) 主要处理I/O的模拟和管理,由QEMU实现。
内核模式 (Kernel Mode) 主要处理高性能和高安全的指令。
客户模式 (Guest Mode) 主要执行Guest的大部分命令。
4)基于vCPU的kvm_intel的分层架构
2 kvm下CPU调度
2.1 处理器亲和性
默认情况下,所有CPU都可以调度,对进程会分片处理,但是有的软件不支持并行处理机制,即运行该软件时它会独占一个CPU;而虚拟机也是物理机的进程,那么如何让虚拟机也独占某个一CPU呢?CPU自主调度是根据内部的精密算法进行的,而想要人为去控制CPU调度,将CPU与某进程绑定,这种绑定叫做处理器的亲和性。有两种方法:
2.1.1 简单方法——在物理机中操作,使用taskset命令
taskset -pc CPU编号 虚拟机进程号(用ps elf | grep ceshi查看)
virsh vcpuinfo 虚拟机名
virsh vcpupin 虚拟机名 虚拟机CPU编号 物理机CPU编号
virsh vcpupin centos7.0 1 21
virsh vcpupin centos7.0 2 0-4
2.1.2 复杂方法——在物理机上创建1层虚拟机,把内存给大点,指定4个CPU,8G内存,并且在1层虚拟机上添加KVM透传。然后在1层虚拟机上操作
注:用#virsh console登入到1层虚拟机,然后可以在1层虚拟机上用virt-manager管理2层虚拟机;这要求1层虚拟机也有kvm,安装了字符化系统。
1) 在开机时进入到grub2菜单中,找到Linux16那一行,在后面添加 isolcpus=1,2 ,这就是停掉了第1,2个CPU;
2) 开机后,查看CPU使用情况,
ps -eLo psr | grep 0 | wc -l
ps -eLo psr | grep 1 | wc -l
ps -eLo psr | grep 2 | wc -l
ps -eLo psr | grep 3 | wc -l
我的实验结果中使用第1,2个CPU的进程只有5个,而使用另外两个CPU的进程有65个,这就意味着上一步成功了;
3) 把这个虚拟机作为物理机,先安装字符化操作系统,在此基础上安装kvm,再创建一个虚拟机vm-1-2,#ps elf | grep vm-1-2 查看虚拟机pid,然后查看CPU使用情况。
1503就是vm-1-2的PID,可见CPU使用量已经达到了102%;但是,此时可以发现只有0,3号CPU使用量很多,1,2号CPU使用量还是只有5。这就成功地进行了绑定,
ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==1) print $0}'
ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==2) print $0}'
说明:
A)、migration 用于进程在没CPU间迁移; kworker 用于处理workqueues ;ksoftirqd 用于调度CPU软中断的进程
B)、-e 显示所有进程 ;-L 显示LWP light weight process; -o 自定义输出
C)、psr 处理器编号; lwp 线程ID ;ruser 运行进程的用户; pid 进程ID; ppid 父进程ID; args 运行的命令和参数
第四步:用命令将虚拟机PID指定到某个CPU上,再查看CPU使用情况。
#virsh vcpupin 虚拟机名 虚拟机CPU编号 物理机CPU编号
#top 或 #sar -u 或 #uptime
2.2 kvm超配CPU:就是over-commit过载使用。
举个例子,如果物理机的vCPU有24个,内存为1T,现在要配置虚拟机,这些虚拟机在使用时都属于不吃CPU的。而根据经验,一般在配置时CPU:内存=1:4-8,也就是说1个CPU对应4-8G内存。为了能够为更多的客户服务,挣更多的钱,此时我们可以配置给每个虚拟机2个CPU,8G内存,配置60台,那么总CPU数=2*60=120个,这远远超过了物理机的CPU数,总内存=8*60=480G<<1T,但是没关系,因为这些虚拟机都是不吃CPU的,所以每台虚拟机可以正常使用。这就是所谓的超配。
根据经验,超配比是16,即实际vCPU:超配后的CPU总数=1:16,本例就意味着,超配后的CPU总数不能超过24*16个。
转载请注明出处,谢谢!