前面我们成功的把KVM跑起来了,有了些感性认识,这个对于初学者非常重要。不过还不够,我们多少要了解一些KVM的实现机制,这对后面工作会很有帮助。
 
CPU 虚拟化
 
KVM 的虚拟化 是需要CPU硬件支持的。还记得我们在前面的章节讲过用命令来查看CPU是否支持KVM虚拟化吗?
 
root@ubuntu:~# egrep -o '(vmx|svm)'  /proc/cpuinfo
vmx
vmx
vmx
vmx
 
如果输出有 vmx 或者 svm ,就说明当前的CPU 支持 KVM 。 CPU 厂商 intel 和 AMD 都支持虚拟化,除非是非常老的 CPU。
 
一个 KVM 虚拟在宿主机中其实就是一个qemu-kvm 进程,与其他 Linux进程一样被调度。比如我们在实验机上运行的虚机 kvm1 ,在宿主机的ps中就可以看到他的进程。
 
root@ubuntu:~# ps -ef | grep kvm1
libvirt+  4988     1  9 20:39 ?        00:00:05 qemu-system-x86_64 -enable-kvm -name kvm1 -S -machine pc-i440fx-xenial,accel=kvm,usb=off -cpu Haswell-noTSX -m 100 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 3a40949c-5e76-43b2-9a5c-60ebb442798d -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-kvm1/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/var/lib/libvirt/images/cirros-0.3.3-x86_64-disk.img,format=qcow2,if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=30,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:47:ab:ab,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=16,bus=pci.0,addr=0x2 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
 
 
虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。见下图
 
 
在这个例子中,宿主机有两个物理CPU,上面起了两个虚机 VM1 和 VM2 。VM1 有两个 vCPU,VM2有4个vCPU。可以看到VM1 和 VM2分别有2个和4个线程在两个物理CPU上调度。
 
这里也演示了另一个知识点,即虚机的vCPU总数可以超过物理CPU数量,这个叫 CPU overcommit (超配)。KVM允许 overcomit ,这个特性使得虚机能够充分利用宿主机的CPU资源,但前提是在同一时刻不是所有的虚机都满负荷运行。当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit的时候,需要对虚机的负载情况有所了解,需要测试。
 
内存虚拟化
 
KVM 通过内存虚拟化共享物理系统内存,动态分配给虚机。见下图
 
 
为了在一台机器上运行多个虚机,KVM需要实现 VA (虚拟内存) -> PA (物理内存) -> MA (机器内存)之间的地址转换。虚机OS控制 VA - PA ,物理机OS 控制 PA - MA。
 
内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存,但使用时也需要充分测试,否则会影响性能。
 

O006、CPU和内存虚拟化原理的更多相关文章

  1. CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU ...

  2. CPU 和内存虚拟化原理

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU ...

  3. KVM 介绍(2):CPU 和内存虚拟化

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  4. KVM(二)CPU 和内存虚拟化

    1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring 是指 ...

  5. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  6. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  7. 虚拟化技术原理(CPU、内存、IO)

    本文来自:http://www.ywnds.com/?p=5856 虚拟化 云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一. 云计算的云端系统, 其实质上就是一个大型的分 ...

  8. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  9. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

随机推荐

  1. 【好书推荐】9、安卓Andorid编程吐血整理100+本

    点开即可

  2. 转贴 使用正则表达式解析一般sql语句(C++)

    https://blog.csdn.net/dreamgchuan/article/details/47715743 --END--2019年9月5日11点58分

  3. Breadcrumb 面包屑

    显示当前页面的路径,快速返回之前的任意页面. 基础用法 适用广泛的基础用法. 在el-breadcrumb中使用el-breadcrumb-item标签表示从首页开始的每一级.Element 提供了一 ...

  4. JQUERY的$(function(){})和window.onload=function(){}的区别

    在Jquery里面,我们知道入口函数有两种写法:$(function(){}) 和$(document).ready(function(){}) 作用类似于传统JavaScript中的window.o ...

  5. 批量替换word内容

    有一个需求需要把word中的一段文档的编号批量替换 如,把133-183批量的替换成31-81,需要批量的替换word,脚本如下 from docx import Document import os ...

  6. 转: 动态加载、移除js、css文件

    function loadjscssfile(filename, filetype){ if (filetype=="js"){ var fileref=document.crea ...

  7. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_3 配置解决中文乱码的过滤器

    输入中文 中文后台接收到 全部乱码 springMvc提供了过滤器 配置过滤器 characterEncodingFilter是首字母小写当做起的名称.当然这里也可以任意起名字.为了对应所以修改类名首 ...

  8. kubernetes学习:CKA考试认证(二)

    1. 它题的意思是 在 development 名称空间里面 找到名为 baz的 service 然后通过这个service的selector 找出 对应的pod . 要用   kubectl des ...

  9. Django的下载与使用基础

    下载安装 命令行 pip3 install django==1.11.23 -i https://pypi.tuna.tsinghua.edu.cn/simple pycharm file -- &g ...

  10. BeanPostProcessor详解

    转自: https://www.jianshu.com/p/d26e8ec9c077? BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创 ...