qemu与kvm

QEMU是一个开源项目, 实际就是一台硬件模拟器, 可以模拟许多硬件, 包括X86架构处理器、 AMD64架构处理器、 MIPSR4000ARM v6/v7Cortex-A8A9A15) 、 SPARC sun3PowerPC架构, 还支持其他架构, 可以从QEMU主页获取完整的列
  


KVMKernel-based Virtual Machine) 最初是由以色列的公司Qumranet开发的。 KVM20072月被正式合并到Linux 2.6.20核心中, 成为内核源代码的一部分。 200894日, RedHat公司收购了Qumranet, 开始在RHEL中用KVM替换Xen, 第一个包含KVM的版本是RHEL 5.4。 从RHEL 6开始, KVM成为默认的虚拟化引擎。 KVM必须在具备Intel VTAMD-V功能的X86平台上运
行。 它也被移植到
S/390PowerPCIA-64平台上。 在Linux内核3.9版中, 加入了对ARM架构的支持  

KVM就是内核的一个模块, 用户空间通过QEMU模拟硬件提供给虚拟机使用, 一台虚拟机就是一个普通的Linux进程, 通过对这个进程的管理, 就可以完成对虚拟机的管理  



libvirt与kvm

Libvirt是一套开源的虚拟化的管理工具, 主要由3部分组成:

  • 一套APIlib库, 支持主流的编程语言, 包括CPythonRuby等。
  • Libvirtd服务。
  • 命令行工具virsh  

Libvirt还支持远程的宿主机管理, 只要在宿主机上启动Libvirtd服务并做好配置, 就可以通过Libvirt进行虚拟机的配置。 通道可以是以下方式:

  • SSH。 #以前玩的用virt-Manager工具 输入远程主机 ssh 账号密码 连接远程主机 可以直接远程给宿主机安装虚拟机系统 启动 关闭
  • TCP
  • 基于TCPTLS

Libvirt将虚拟机管理分为以下几个方面

  1. 存储池资源管理, 支持本地文件系统目录、 裸设备、 lvmnfsiscsi等方式。 在虚拟机磁盘格式上支持qcow2vmdkraw等格式  
  2. 网络资源管理, 支持Linux桥、 VLAN、 多网卡绑定管理, 比较新的版本还支持Open vSwitchLibvirt还支持nat和路由方式的网络, Libvirt可以通过防火墙让虚拟机通过宿主机建立网络通道, 和外部的网络进行通信  


虚拟化还有一个重要的功能就是快速部署。 在宿主机层面看, 虚拟机就是一个镜像文件, 要得到另外一台虚拟机, 只需要将镜像文件复制一份就可以了, 通常只有几分钟。 而按照传统方式部署一台物理机, 最起码都要一个小时。 通过磁盘差量的技术,甚至可以做到秒级生成虚拟机。

通过虚拟化技术, 还可以实现在虚拟化层做高可用和在线迁移。 虚拟化层的高可用是系统层面的高可用, 比基于应用层的高可用配置要简单很多。 虚拟机的在线迁移, 更是虚拟化技术的独有手段。 通过在线迁移, 物理机的维护、 系统的维护、 网络的维护, 都可以做到不中断服务, 进一步提高了业务应用的可用性。


因为所有的虚拟机都是相同的虚拟硬件, 实现了硬件层级的标准化, 降低了自动化的难度, 很容易搭建私有或者公有的云平
台, 所以通过虚拟机技术, 很容易实现以下功能:
·资源使用自动化和自助服务。
·资源池可随时扩展。
·资源使用标准化。
·资源使用保持了很好的兼容性  


cpu,内存 虚拟机技术

KVM虚拟机CPU的软件调优首先需要对NUMA技术有一定的了解, 调优的主要手段就是虚拟机对物理机CPU逻辑核的手工绑定  

CPUNested特性使用也是非常有意思的一个特性, KVM虚拟机的嵌套在理论上可以无限层地嵌套下去, 只要物理机的性能足够  。

Nested技术, 简单地说, 就是在虚拟机上运行虚拟机, 即KVM on KVM CentOS 7官方宣称不正式支持Nested技术

 

内存方面的调优手段主要是KSM 内存压缩, 即相同内存页合并、 内存气球技术及大页内存的使用 

KSMCentOS 6CentOS 7上默认是打开的, 主要有两个服务:
·KSM服务。
·ksmtuned服务 

内存气球技术可以在虚拟机之间按照需要调节内存大小, 提高内存的利用率 ,就是内存 膨胀 压缩 通过 virsh qemu-monitor-command 命令控制  也可以编辑xml配置文件


NUMA是一种解决多CPU共同工作的技术方案, CPU共同工作主要有3种架构, 分别是SMPMPPNUMA架构SMPMPPNUMA都是为了解决多CPU共同工作的问题

SMP 即  多个cpu 通过一个总线访问存储器(是一块内存吗) 。也叫一致内存访问结构体系。无论在什么时候 处理器 保持或共享 内存的每个数据,SMP多核共享存储器 所以 存储器接口就是瓶颈 支持的cpu个数有限。

MPP 分布式存储器模式 几个处理器有一个存储器 为一个组 ,每个组都是一个节点 每个节点通过一个总线连接 访问内存。就是SMP的横向扩展 一般靠软件实现。

NUMA 每个处理器都有自己的存储器 每个处理器 也可以访问别的处理器的存储器  访问自己的比访问别的速度快10-100倍 ,所有NUMA调优就是让处理器尽量访问自己的存储器。以提高处理速度

numactl --hardware  #可以看到当前CPU硬件的情况 2个节点 每个节点16个核  每个节点 96G内存可以

available: 2 nodes (0-1)

node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30

node 0 size: 98210 MB

node 0 free: 441 MB

node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31

node 1 size: 98304 MB

node 1 free: 912 MB

node distances:

node   0   1 

  0:  10  21 

  1:  21  10 

numastat 
                           node0           node1
numa_hit             18085902029     14561691699  #使用内节点内存数量
numa_miss             4462678911      1670877257  #计划使用本节点而被调用到其他节点的次数
numa_foreign          1670877257      4462678911 #计划使用其他节点而被调度到本节点的次数
interleave_hit             58866           58930              #交叉分配使用的内存中 使用本节点的内存次数
local_node           18085784098     14561627998  #在本节点运行的程序使用本节点的内存次数
other_node            4462796842      1670940958   #在其他节点使用本节点的内存次数


numastat -c qemu-kvm  #查看相关进程的numa内存使用情况


Per-node process memory usage (in MBs)

PID              Node 0 Node 1  Total

---------------  ------ ------ ------

15839 (qemu-kvm)   5307   2808   8115

16197 (qemu-kvm)   4560   3558   8118

16433 (qemu-kvm)   7993   7644  15637

17262 (qemu-kvm)   4114   4003   8117

19550 (qemu-kvm)   1354   6764   8119

21745 (qemu-kvm)    476    605   1081

24356 (qemu-kvm)   5580   4598  10178

48354 (qemu-kvm)  12628  12990  25618

75615 (qemu-kvm)    481    564   1045

90003 (qemu-kvm)   1032   2595   3627

94294 (qemu-kvm)   1222   1480   2702

145195 (qemu-kvm   4810   3308   8118

153789 (qemu-kvm   1969   3255   5224

168933 (qemu-kvm   1583   3525   5108

169769 (qemu-kvm   1020    839   1859

172703 (qemu-kvm   4932   3188   8120

173581 (qemu-kvm   4504   3613   8117

182464 (qemu-kvm   6902   5336  12238

182490 (qemu-kvm    479   7638   8117

185346 (qemu-kvm   6493   5745  12238

189666 (qemu-kvm   5187   5281  10468

---------------  ------ ------ ------

Total             82625  89338 171963


linux 默认numa平衡 /proc/sys/kernel/numa_balancing 为 0关闭 为1 打开




 

总结

关于服务器虚拟化的一些软件作用

rpm -qa|grep -E "kvm|qemu|virt"

libvirt-0.10.2-60.el6.x86_64       #用于管理虚拟机,它提供了一套虚拟机操作的api

libgovirt-0.3.2-2.el6.x86_64

virt-manager-0.9.0-31.el6.x86_64  #libvirt的图形化虚拟机管理软件

virt-what-1.11-1.2.el6.x86_64     #在虚拟机内部执行,查看虚拟机运行的虚拟化平台

qemu-img-0.12.1.2-2.491.el6_8.1.x86_64   #用于操作虚拟机硬盘镜像的创建,查看 和格式转化

gpxe-roms-qemu-0.9.7-6.15.el6.noarch  #虚拟机pxe组件 支持虚拟机从网络启动

libvirt-client-0.10.2-60.el6.x86_64        #libvirt客户端 最重要的功能是在宿主机关机时 通知虚拟机正常关机 而不是强制关机

libvirt-python-0.10.2-60.el6.x86_64     #libvirt为python提供的api

qemu-kvm-0.12.1.2-2.491.el6_8.1.x86_64   #kvm在用户空间运行的程序,qemu-kvm 命令行启动虚拟机的命令

virt-v2v-0.9.1-5.el6_5.x86_64

virt-viewer-2.0-14.el6.x86_64

qemu-kvm-tools-0.12.1.2-2.491.el6_8.1.x86_64

python-virtinst-0.600.0-29.el6.noarch   #python安装虚拟机工具




-----------------深度实践KVM读书笔记