首页 > 系统相关 >每天5分钟复习OpenStack(七)内存虚拟化

每天5分钟复习OpenStack(七)内存虚拟化

时间:2023-10-26 22:57:05浏览次数:33  
标签:大页 复习 虚拟化 客户机 内存 OpenStack 虚拟机 页表

标题中的存储虚拟化,涉及到两个方面,分别是内存和磁盘的虚拟化技术。内存的虚拟化就不得不提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的章节将会详细介绍大页内存的使用。

标签:大页,复习,虚拟化,客户机,内存,OpenStack,虚拟机,页表
From: https://www.cnblogs.com/alex0815/p/17790694.html

相关文章

  • usb2.0协议复习--Apple的学习笔记
    一,前言10多年前买过一本圈圈教你usb,然后自己移植了代码到自己焊接的单片机最小系统,当时连原理图都是我自己画的,现在原理图软件已经不知道怎么用了,所以usb协议基本也忘记了。居然配置了usbhost那么简单,这样感觉都没有学习过什么,我还是希望要雁过留痕。所以下载了wiresharkusb抓包......
  • java复习
    java中成员变量和局部变量的区别是什么?作用域不同,局部变量的作用域仅限于定义它的方法,在该方法外无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它,如果访问权限允许,还可以在类外部使用成员变量;初始值不同,对于成员变量,如果在类定义中没有给它赋予初......
  • C语言语法(复习专用)
    普通分隔符:分号「 ; 」:语句结尾大括号「 {} 」:函数体,复合语句以及数组的初始化等;圆括号「 () 」:函数定义时用来括住参数,或者用来修改运算顺序,比如:(a+1) 2和a+(1 2)方括号「 [] 」定义数组类型和应用元素,比如:inta10;b=a3;点号「 . 」:结构体仲引用成......
  • 软件设计师中级复习
     U1-U3用户做什么java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别(2016-07-12)-scevecn-博客园(cnblogs.com)  包含:聚合:只是聚会而已,还是会分开的组合:实现:接口包含:先把右边的执行,才能执行左边的泛化:之类在父类上重写方法,或者是延伸的对应实......
  • Openstack组件介绍
    Openstack七大组件介绍,OpenStack是一套laas解决方案,OpenStack是一个开源的云计算管理平台,以Apache许可证为授权Horizon组件——Horizon为OpenStack服务的Web控制面板,可以管理实例、镜像、创建密钥对,对实例添加卷、操作Swift容器等。——Horizon具有如下一些特点:——实力管理:创建、......
  • java复习
    内部类有哪些分类?在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。内部类的分类一般主要有四种:⚫成员内部类⚫局部内部类⚫匿名内部类⚫静态内部类静态内部类就是定义在类内部的静态类,静态内部......
  • WPF ItemsControl 卡顿 数据量大 虚拟化 优化
    <ItemsControlItemsSource="{BindingMemberInfos}"VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLength="50">......
  • 每天5分钟复习OpenStack(六)CPU虚拟化<2>
    OpenStack是一个IAAS(基础设施即服务)因此免不了会与硬件打交道。下面我介绍下与CPU强关联的一些知识点。1什么是超配2CPU的个数是怎么统计的3vCPU的隔离、绑定1、超配在kvm虚拟化的环境中,一个vCPU本质上是一个kvm的一个线程,如果一台虚拟机有4个vCPU,对应的就是4个线程......
  • 复习一下mysql
    mysql复习:修改密码setpassowrd="123456";数据库创建:showdatabases;显示数据库createdatabasename;创建dropdatabasesname;删除usename;选中数据库操作表:createtablestudy(`id`int(5),`name`varchar(10));创建表showtables;显示所有表descname;显示表信息altert......
  • GPU实现虚拟化
    GPU虚拟化[一]兰新宇talkischeap​关注他 对于GPU这样的高速PCIe设备,虽然也可以借助virtio的方式来实现guestVM对GPU资源的共享,但因为需要hypervisor参与emulation,效率不高。性能更佳的方案是将物理GPU 以整体或部分的形式,“透......