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

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

CPU 虚拟化

KVM 的虚拟化是需要 CPU 硬件支持的。还记得我们在前面的章节讲过用命令来查看 CPU 是否支持KVM虚拟化吗?

root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo
vmx

如果有输出 vmx 或者 svm,就说明当前的 CPU 支持 KVM。CPU 厂商 Intel 和 AMD 都支持虚拟化了,除非是非常老的 CPU。

一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。
比如在我的实验机上运行的虚机 kvm1 在宿主机中 ps 能看到相应的进程。

虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。看下图

在这个例子中,宿主机有两个物理 CPU,上面起了两个虚机 VM1 和 VM2。
VM1 有两个 vCPU,VM2 有 4 个 vCPU。可以看到 VM1 和 VM2 分别有两个和 4 个线程在两个物理 CPU 上调度。

这里也演示了另一个知识点,即虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。
KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。
当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit 的时候,需要对虚机的负载情况有所了解,需要测试。

内存虚拟化

KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。看下图

为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。具体的实现就不做过多介绍了,大家有兴趣可以查查资料。

还有一点提醒大家,内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存。但使用时也需要充分测试,否则性能会受影响。

下一节我们讨论 KVM 如何实现存储虚拟化。

 

时间: 2024-07-30 13:16:32

CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)的相关文章

L2 Population 原理 - 每天5分钟玩转 OpenStack(113)

前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统的 Scalability 好,其意思是: 当系统的规模变大时,仍然能够高效地工作. L2 Population 到底解决了怎样的 Scalability 问题? 请看下图: 这是一个包含 5 个节点的 VXLAN 网络,每个节点上运行了若干 VM. 现在假设 Host 1 上的 VM A 想与 H

Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)

前面我们陆续学习了 Neutron local network,flat network 和 DHCP 服务,从本节将开始讨论 vlan network. vlan network 是带 tag 的网络,是实际应用最广泛的网络类型.下图是 vlan100 网络的示例. 1. 三个 instance 通过 TAP 设备连接到名为 "brqXXXX" linux bridge. 2. 在物理网卡 eth1 上创建了 eth1.100 的 vlan interface,eth1.100 连接

Neutron Router 工作原理 - 每天5分钟玩转 OpenStack(142)

上一节我们创建了 router 连通了 vlan100 和 vlan101, 今天分析router是如何工作的. 首先查看控制节点的网络结构发生了什么变化: br-int 上多了两个 port:  1. qr-d295b258-45,从命名上可以推断该 interface 对应 router_100_101 的 interface (d295b258-4586),是 subnet_172_16_100_0 的网关.  2. qr-2ffdb861-73,从命名上可以推断该 interface 对

cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下面的定制化工作: 设置 default locale 设置 hostname 添加 ssh keys到 .ssh/authorized_keys 设置用户密码 配置网络 安装软件包 为了实现 instance 定制工作,cloud-init 会按 4 个阶段执行任务: local init conf

写在最前面 - 每天5分钟玩转 OpenStack(1)

<每天5分钟玩转 OpenStack>是一个 OpenStack 教程,这是第 1 篇. 这个教程有下面两个特点: 系统讲解 OpenStack 从架构到各个组件:从整体到细节逐一讨论 重实践并兼顾理论 主要从实际操作的角度带着大家学习 OpenStack.   为啥要写这个? 简单回答是:因为OpenStack 学习难度大,但如果掌握了价值会很大 先做一个自我介绍吧. 本人网名CloudMan,在 IT 这个行当已经摸爬滚打了十多年,05年之前是搞上层应用开发的,那时候 Java 比较火,所

虚拟化 - 每天5分钟玩转 OpenStack(2)

  OpenStack是云操作系统,要学习OpenStack,首先需要掌握一些虚拟化和云计算的相关知识. 虚拟化 虚拟化是云计算的基础.简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU.内存.IO 硬件资源,但逻辑上虚拟机之间是相互隔离的. 物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest). 那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?这个主要是通过一个叫做 Hypervisor 的程序实现的.

限制容器对内存的使用 - 每天5分钟玩转 Docker 容器技术(27)

一个 docker host 上会运行若干容器,每个容器都需要 CPU.内存和 IO 资源.对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU.内存资源给每个虚拟机.对于容器,Docker 也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能. 内存限额 与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap. Docker 通过下面两组参数来控制容器内存的使用量. -m 或 --memory:设置内存的使用限额,例如 100M, 2

准备 KVM 实验环境 - 每天5分钟玩转 OpenStack(3)

  KVM 是 OpenStack 使用最广泛的 Hypervisor,本节介绍如何搭建 KVM 实验环境  安装 KVM 上一节说了,KVM 是 2 型虚拟化,是运行在操作系统之上的,所以我们先要装一个 Linux.Ubuntu.Redhat.CentOS 都可以,这里我们以 Ubuntu14.04 为例. 基本的 Ubuntu 操作系统装好之后,安装 KVM 需要的包  $ sudo apt-get install qemu-kvm qemu-system libvirt-bin virt-

云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)

"云计算" 算是近年来最热的词了.现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼. 对于云计算,学术界有各种定义,大家有兴趣可以百度一下. CloudMan 这里主要想从技术的角度谈谈对云计算的理解. 基本概念 所有的新事物都不是突然冒出来的,都有前世和今生. 云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下图 IT系统架构的发展到目前为止大致可以分为3个阶段: 物理机架构这一阶段,应用部署和运行在物理机上. 比如企业要上一个E