标题中的存储虚拟化,涉及到两个方面,分别是内存和磁盘的虚拟化技术。内存的虚拟化就不得不提EPT和VPID 技术.

首先申明下本人其实不想写一些纯理论的东西,但是架不住面试经被问,为此特将一些特别复杂的技术底层都隐去,尽量将技术讲的简单,我个人信奉一句话'If you can't explain it simply, you don't understand it well enough.'

内存虚拟化发展

初心:想拥有一段从头开始的地址段。

  • 在物理机中内存空间是一个从零开始的连续的物理内存空间,为了使虚拟机也拥有一个从零开始的连续的物理内存空间,KVM 引入了一层新的地址空间,即客户机的物理地址空间。(该地址空间并不是真正硬件上地址空间)。这样原先在物理机上一个单层架构变成现在三层架构。
  1. 客户机虚拟地址(Guest Virtual Address,GVA )
  2. 客户机物理地址(Guest Physical Address,GPA )
  3. 宿主机物理地址 (Host Physical Address,HPA )

得到一个三节棍

一次内存的访问要经过两次地址转换 GVA -> GPA -> HPA ,其效率可想而知是不高的。为了解决上述问题,一种叫影子页表(Shadow Page Tables)技术从软件上实现了客户机虚拟地址 -> 宿主机的物理地址的直接转换。

影子魔法

  • 影子页面虽然解决了两次地址转换的问题,但是其为每一个客户机都维护一个影子页表,其内存开销也比较大,而且其技术基于软件来实现,维护和调试都比较复杂

  • 为了解决影子页表的问题,Intel的CPU提供了EPT技术(AMD提供的类似技术叫作NPT,即Nested Page Tables),直接在硬件上支持GVA→GPA→HPA的两次地址转换,从而降低内存虚拟化实现的复杂度,也进一步提升了内存虚拟化的性能.

  • VPID(Virtual Page Identifier)则是 EPT 技术中一个重要的标识符。它用于区分不同虚拟机之间的页表,确保每个虚拟机都有独立的页表和内存空间。

  • VPID 在虚拟化环境中起到类似身份证的作用。每个虚拟机都被分配一个唯一的 VPID,用于标识该虚拟机的页表。这样,不同的虚拟机可以同时运行,并且每个虚拟机都有自己独立的内存空间,互相之间不会干扰彼此。

总结来说,EPT 是一种虚拟化技术,用于用硬件的方式来实现两次地址转换,改善虚拟机内存访问效率,而 VPID 则是在 EPT 技术中使用的标识符,用于区分不同虚拟机的页表内存空间

验证

  1. CPU 标记中是否支持EPT 和VPID
lscpu |grep -E "ept |vpid" 或
cat /proc/cpuinfo |grep -E "ept |vpid"

  1. 模块是否加载

在默认情况下,如果硬件支持了EPT、VPID,则kvm_intel模块加载时默认开启EPT和VPID特性,这样KVM会默认使用它们

# cat /sys/module/kvm_intel/parameters/ept
Y
# cat /sys/module/kvm_intel/parameters/vpid
Y

如果发现自己的环境没有开启可以通过

modprobe kvm_intel ept=1,vpid=1 来开启

扩展

内存也是可以超配的(也称为过载使用over-commit),只是我们一般不这样做,但是有些测试环境可以采用一些技术来允许内存的超配使用。

当计算机的内存不足时,宿主机操作系统可以采用一些技术来帮助解决这个问题。以下是三种常见的技术:

1)内存交换(swapping):这是一种利用硬盘上的交换空间来暂时存储不常用的内存数据的方法。当内存不足时,操作系统会将一部分数据从内存中移出,并存储到硬盘上的交换空间中。这样,操作系统可以腾出更多的内存供其他程序使用。当需要访问被交换出去的数据时,它们将被再次加载回内存。

概括:将内存中数据,挤掉不常用数据放在硬盘上来释放内存空间。对应就是linux上Swap 分区。

2)气球(ballooning):这是一种在虚拟化环境中使用的技术。它通过在客户机和宿主机之间协作来管理内存。当宿主机的内存资源紧张时,它会使用一个特殊的驱动程序,即virio_balloon驱动,在客户机中释放一些未使用的内存。这些被释放的内存可以供其他需要的客户机使用。

概括:物理机内存不足时,膨胀客户机内存气球,挤压出空闲内存供物理机使用,同理客户机内存不足时,压缩内存气球,释放出内存供客户机使用。

kvm虚拟机加上如下配置

在客户机里面进行验证

3)页共享(page sharing):当多个进程在客户机上运行时,它们可能会使用相同的内存页,例如代码或库文件。为了节省内存空间,操作系统可以使用KSM(Kernel Samepage Merging)技术将这些相同的内存页合并为一个,并让多个进程共享该页。这样,操作系统可以减少内存的使用,提高资源利用率。

缺点:利用 KSM 使内存超用。这会导致消耗一定的计算资源用于内存扫描,加重了 CPU 的消耗。内存超用,使得频繁地使用 swap 交互,导致 VM 性能下降。

概括:在有多个客户机使用相同的操作系统时,其会存在大量相同的内存页,将这些内存页合并,进而来减少内存占用。但其频繁的内存扫描,加重CPU的消耗,本质上是一种以CPU换内存的措施,生产中是建议关闭。

  • 禁止所有客户虚拟机KSM 页共享:
echo 0 > /sys/kernel/mm/ksm/pages_shared
echo 0 > /sys/kernel/mm/ksm/pages_sharing

内存优化技术

大页内存:

大页内存是计算机系统中的一种内存管理机制,它将传统的小块内存(通常为4KB)组合成更大的内存块(通常为2MB或1GB)。相比于小页内存,大页内存拥有更大的连续地址空间。

大页内存的主要作用是改善系统的性能。这是因为在传统的小页内存中,每个页面都需要额外的内存开销来存储页表信息。当系统处理大量的内存访问请求时,这些额外的开销会导致缓存不命中、TLB(Translation Lookaside Buffer)失效等问题,从而降低系统的性能。

通过使用大页内存,系统可以减少页表的数量和大小,从而降低了内存管理的开销。这样一来,系统在处理内存访问时可以更高效地利用缓存和TLB,提高数据访问速度,减少对内存子系统的负载。特别是在需要大量连续内存的应用程序(如数据库、虚拟化环境等)中,使用大页内存可以显著提升性能。

总而言之,大页内存通过将小块内存组合成更大的内存块,减少了内存管理的开销,提高了系统的性能,尤其适用于对连续内存需求较大的应用场景。

  • 4.1 查看是否开启了大页内存。
cat /sys/kernel/mm/transparent_hugepage/enabled
  • 4.2 如果没有开启则编辑开机启动菜单,开启大页内存
编辑 /etc/default/grub
#加上如下参数,这里是开启了大页内存,大小为1G的大页内存,有2页,则大页内存的总容量=1G*2
transparent_hugepage=always hugepagesz=1G hugepages=2

这里先简单介绍下大页内存的加载,之后我们在DPDK的章节将会详细介绍大页内存的使用。

每天5分钟复习OpenStack(七)内存虚拟化的更多相关文章

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

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

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

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

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

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

  4. KVM 内存虚拟化

    内存虚拟化的概念     除了 CPU 虚拟化,另一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机.虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存 ...

  5. qemu-kvm内存虚拟化1

    2017-04-18 记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下 ...

  6. 2017.4.28 KVM 内存虚拟化及其实现

    概述 KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 KVM 的开源虚拟化生态系统也日 ...

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

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

  8. CPU 和内存虚拟化原理

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

  9. O006、CPU和内存虚拟化原理

    参考https://www.cnblogs.com/CloudMan6/p/5263981.html   前面我们成功的把KVM跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少要 ...

  10. 【原创】Linux虚拟化KVM-Qemu分析(五)之内存虚拟化

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

随机推荐

  1. 在js中修改less文件内样式

    在项目中使用使用进度条时遇到了一点问题,根据需求进度条的百分比需要在条内显示,但是当完成度太低时由于进度条背景和百分比值都是接近的颜色,所以此时无法显示进度值,这个时候需要根据完成度大小来进行判断,动 ...

  2. AcWing 4490. 染色题解

    题目描述 样例 输入: 6 1 2 2 1 5 2 1 1 1 1 1 输出 3 算法描述 思路 我们以样例为例讲讲思路. 如何确保dfs能顺利便利呢,我们可以使用链式前向星来存图(树) C++代码 ...

  3. sql相关小知识—

    数据库系统达到了数据独立性是因为采用了三级模式结构 人们为数据库设计了一个严谨的体系结构,数据库领域公认的标准结构是三级模式结构,它包括外模式.概念模式.内模式,有效地组织.管理数据,提高了数据库的逻 ...

  4. 压制GIF做的一点点小尝试 以及ezgif的基本功能使用

    事情的起因 首先群友给我整了个loli莉音的视频 很可爱 但是用qq接收的视频没法一直在那边kawaii 图片本身很小其实 但是转gif就很大 转出来的gif的大小就大的唏嘘 寻找问题 这就是mp4的 ...

  5. JSONP前端流程

    JSONP前端流程 JSONP总体思路 后端先给前端一个接口文档. 如https://www.baidu.com/sugrec?prod=pc&wd=用户输入的文字&cb=后端要调用的 ...

  6. 如何操作(增、删、改、查)常见的 HTML 元素呢?(包含原生 js 和 JQuery 语法对照)

    一.通用的操作示例 1.查询 根据 id 查询(结果为单个对象) // 原生 js 写法 var elementobj = document.getElementById("elementi ...

  7. JavaScript的Map和WeakMap

    熟悉JavaScript的Map和WeakMap Map Map的键/值可以是任何类型 基本API 初始化映射: //使用new关键字和Map构造函数进行初始化 const m1 = new Map( ...

  8. Android Studio Giraffe安装与gradle配置

    本机环境:win10专业版,64位,16G内存. 原先用的AS2.2,是很早之前在看<第一行代码Android(第2版)>的时候,按书里的链接下载安装的,也不用怎么配置.(PS:第一行代码 ...

  9. 【路由器】小米 WR30U 解锁并刷机

    本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中有一些细节需要注意,因此记录一下 解锁 ssh 环境准备 ...

  10. mac安装mysql8.0

    1.进入下载页 历史版本:https://downloads.mysql.com/archives/community/ 最新版本:https://dev.mysql.com/downloads/my ...