天天看点

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

      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中的三种进程模式

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

用户模式 (User Mode) 主要处理I/O的模拟和管理,由QEMU实现。

内核模式 (Kernel Mode) 主要处理高性能和高安全的指令。

客户模式 (Guest Mode) 主要执行Guest的大部分命令。

4)基于vCPU的kvm_intel的分层架构

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

2  kvm下CPU调度

2.1 处理器亲和性

      默认情况下,所有CPU都可以调度,对进程会分片处理,但是有的软件不支持并行处理机制,即运行该软件时它会独占一个CPU;而虚拟机也是物理机的进程,那么如何让虚拟机也独占某个一CPU呢?CPU自主调度是根据内部的精密算法进行的,而想要人为去控制CPU调度,将CPU与某进程绑定,这种绑定叫做处理器的亲和性。有两种方法:

2.1.1  简单方法——在物理机中操作,使用taskset命令

taskset   -pc   CPU编号   虚拟机进程号(用ps  elf | grep  ceshi查看)

virsh  vcpuinfo  虚拟机名

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

virsh  vcpupin  虚拟机名   虚拟机CPU编号   物理机CPU编号

virsh  vcpupin  centos7.0   1   21

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

virsh  vcpupin  centos7.0   2   0-4

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

2.1.2  复杂方法——在物理机上创建1层虚拟机,把内存给大点,指定4个CPU,8G内存,并且在1层虚拟机上添加KVM透传。然后在1层虚拟机上操作

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度
KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

注:用#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

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

我的实验结果中使用第1,2个CPU的进程只有5个,而使用另外两个CPU的进程有65个,这就意味着上一步成功了;

3) 把这个虚拟机作为物理机,先安装字符化操作系统,在此基础上安装kvm,再创建一个虚拟机vm-1-2,#ps  elf | grep  vm-1-2 查看虚拟机pid,然后查看CPU使用情况。

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

1503就是vm-1-2的PID,可见CPU使用量已经达到了102%;但是,此时可以发现只有0,3号CPU使用量很多,1,2号CPU使用量还是只有5。这就成功地进行了绑定,

KVM虚拟化- KVM 虚机CPU管理1  几个概念2  kvm下CPU调度

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个。

转载请注明出处,谢谢!

继续阅读