2.5.14 动态内存共享AMS

2023-11-19

最后更新2021/08/02

这个还算是比较实用的功能。最早介绍过CPU共享,也提到过内存共享,但CPU共享是动态、实时、按需分配的(虽然有限制条件),而内存需要用DLPar功能,收工调节,至少不是实时分配,那内存可不可以实现类似CPU的实时共享?答案是肯定的,但需要一些配置,这就是AMS(Active Memory Sharing)功能。

如果小型机有AMS授权,则可以支持两种内存模式:独占模式和共享模式(本节所提到的内存,如果没有特别说明,均为物理内存)。

  • 在独占内存模式下,分区拥有固定的内存数量,虽然这个数字可以通过DLpar方式调整,但它不会自动更改。所有活动(启动的)分区的内存加上Hypervisor(微码)占用的内存总和就是小型机所有被使用的内存,其他剩余的内存则归属闲置内存池(Free Memory Pool),新分区启动或者DLpar增加当前活动分区内存都从内存池中抓取内存,而分区停止或者DLpar减少内存所释放的内存又还回内存池。无论经过什么动作,活动内存和未使用内存的总数不会改变。也就是分区之间不能互相抢占,与普通内存DLPar不同的是分区在启动时无需一次性拿到所有分配的内存,而在运行过程中从内存池中申请。

  • 在共享内存模式下,分区被分配的内存成为逻辑数字,而不再是实实在在的物理内存。Hypervisor从物理内存中划分出一部分内存构成共享内存池,Hypervisor可以使用类似DLpar一样的方式向共享内存池中增加或者减少物理内存。当定义共享内存分区时,需要定义分区min(最小)、desired(期望)、max(最大)的逻辑内存数量,而且还有weight(权重)用来控制共享内存分区争抢内存时,谁有更高的优先级。HMC或IVM根据分区内存定义来决定每个分区“确保”可以获得的物理内存,这部分内存被称为I/O entitled memory。各种内存名称说明如<图 2-87 内存定义>所示。
    内存定义图 2-87 内存定义

从技术实现角度分析,AMS的过程与OS内部内存交换区实现方式完全一致,只是涵盖的对象、管理方式有了一些调整。每个分区可以对应于运行于OS中的应用程序,物理内存池则是全部可用物理内存,VIO上创建的交换区与传统内存交换区对应。所不同的是传统内存交换不可以跨越OS,不同分区之间是严格OS隔离的。在AMS模式下,Power VM对OS隔离进行了一点点改动,就是不同AIX分区之间还是彻底OS隔离,但VIO分区具有较高权限,它可以去访问其它AIX分区的物理内存!当然,VIO也并非可以随时随地任意访问其它分区物理内存,必须在拥有Power VM Hypervisor的授权时,才可以访问被允许访问的内存页。

因此AMS的实现过程就是Hypervisor随时监视各个分区的内存使用情况,当它需要从某个分区抽取内存时,会将对应的物理内存映射给VIO分区,然后向VIO发布中断指令,由VIO将物理内存中的数据dump到VIO配置的交换区,再把内存清空。这个过程完成后,物理内存页就成为空闲物理内存,可供其它分区使用。

反之,当分区需要访问被page出去的物理内存时,Hypervisor依然先要把物理内存映射给VIO分区,由VIO将交换区中的数据读回,再把此内存页映射给需要访问此数据的分区。此过程概念并不复杂,但在具体实现时,如何确定物理内存空闲是关键一步,这是由于AIX省缺将所有可用的物理内存都作为文件系统缓存,作为缓存的物理内存是否可以算做“空闲”物理内存呢?另外,如果AIX分区内存不够,AIX自身也会触发内部的内存交换机制,两种不同的交换方式相互之间有何影响?哪一个更优先?下面我们来详细分析这一过程。

正是由于只有分区上运行的OS——AIX才了解自身内存使用情况,判断自身物理内存是否可以“借出”给其它分区是由分区自身AIX而不是Hypervisor或者VIO决定;AIX内部的Paging机制和VIO AMS paging之间没有任何关系,他们是两个相互之间完全独立的过程。从某种意义上说,AIX出借给Hypervisor的物理内存一定是Free的物理内存,当AIX判断某个内存页可以借出,如果它不是Free的物理内存,则会使用AIX内部paging机制,先把物理内存内数据page出去(在自身分区内完成),把此内存页“清空”,再出借。在此处,读者会提出疑问:“既然AIX已经把内存数据page出去,VIO上还需要交换区么?”答案是需要,但它的存在的目的是为分区“借入、抢回”物理内存服务。

当AIX分区需要从Hypervisor拿到物理内存时,如果Hypervisor有足够的空闲物理内存,当然不需要VIO交换区,直接把物理内存映射给分区即可。可是“贷款”太多,Hypervisor管理的内存银行总有周转不灵的时候,分区去Hypervisor“挤兑”,而且金额满足Entirelment内存要求,Hypervisor必须“照单全付”,它就只能从其它超额借入物理内存的分区想办法,强制超额的AIX分区进入中断状态,由VIO把超额使用的物理内存内数据pageout到VIO上设立的交换区,释放的物理内存还给“挤兑”分区。

AMS与AIX内部Paging相比较,AMS的优势是跨分区的,既跨越OS进行物理内存资源分配,这样可以避免系统运行初期分区内存分配不合理的情况。因为在运行初期,对应用到底会占据多少资源都是根据设计和经验拍脑袋出来的结果,真正多少合理、适合,需要在运行过程中逐步调整到位。而调整过程,无疑无法做到及时、准确。通过AMS,相当于有个内存使用管理员随时监控内存使用情况,及时调整内存。

AMS的另一个重要用途在于满足临时内存需求。我们直到AIX使用内存作为文件系统的缓存,如果系统有大量的文件系统文件访问,必然占据很多物理内存。尽管交换机制可以及时释放内存,供其它业务使用,但定时系统备份往往时不时成为偷取大量内存的黑手,造成内存使用抖动,影响业务稳定运行。AMS正好可以跨分区弥补这个缺陷,当某个分区进行文件备份,占用大量内存时,其它分区如果不在备份,就可以释放内存供备份分区临时使用,而无需调整OS内的内存管理参数。

具体AMS实现过程将在下一章节中详细说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.5.14 动态内存共享AMS 的相关文章

  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用
  • Android Studio安装教程+打包APK

    前言 这是一篇给新人的教程 如果你觉得简单啰嗦请保持冷静 同时如果本篇能给予到你帮助 是我的荣幸 Android Studio安装教程 点击链接下载Android Studio Android Studio官网下载 下载完成后双击 exe文

随机推荐

  • [实验三]LZW 编解码算法实现与分析

    目录 一 LZW算法 1 1 编码步骤 1 2 解码步骤 1 3 关于有可能出现当前码字CW不在词典中的情况说明 二 代码实现 2 1 程序说明 2 2 数据结构 2 3 bitio h 2 4 bitio c 2 5 lzw c 三 实验
  • VC++ FTP文件上传(断点续传)

    include
  • vue项目设置ip访问

    1 只用ip访问 打开config gt index 文件 host 172 16 1 95 新增host 改成IP地址 最后重新运行项目 2 既可以IP访问 由可以localhost访问 将config gt index 中host 该为
  • 嵌入式学习(第二周)

    目录 二 C语言基础 2 运算符和表达式 2 1 运算分类 2 2 算数运算符 2 3 关系运算符 2 4 逻辑运算符 2 5 条件运算符 2 6 位运算符 2 7 运算符的运用实例 3 程序结构和过程控制 3 1 C语言程序结构 3 2
  • 2021-03-30 maven

    1 maven父子工程 3 maven环境优化 1 修改web xml为最新的 2 将maven结构搭建完整 4 编写一个servlet Javaweb下载文件的头
  • Java日志简介及SpringBoot日志

    一 什么是日志 日志 就是介绍一个过程和经历的详细记录 项目日志 就是项目开发过程的详细记录 一般由项目经理记录 代码里的日志 就是程序员记录某个开发过程的详细情况 这是项目里每个程序员需要做的工作 日志和异常处理结合得当的话 会给项目维护
  • vue+element-ui 实现弹窗验证用户信息

  • C++零散易错点总结

    对日常做题中遇到的一些零散的易错点的总结 持续更新ing 1 string的length方法返回的是无符号数 当与负数比较时需要强制类型转换 否则会报错 1
  • appium+python自动化测试

    获取APP的包名 1 aapt即Android Asset Packaging Tool 在SDK的build tools目录下 该工具可以查看apk包名和launcherActivity 2 在android sdk里面双击SDK man
  • MYSQL8隐藏索引

    问题场景 我们知道 索引太多会导致UPDATE DELETE INSERT的时候 引擎需要更新索引信息 产生额外的开销 从而影响数据库性能 所以需要清理无效索引 但是表是数年前建的 索引基本都不是自己添加的 无法准确判定是否可以删除 万一删
  • shell 脚本命令太长,如何换行?

    再加ENTER
  • ElasticSearch ES 安装 常见错误 Kibana安装 设置 权限 密码

    最近在学习ES数据库 所以将一些东西记录一下 以下所有的都是基于es7 8 0版本进行的 下载安装ES数据库 安装本体 下载地址 linux mac os windows es的安装非常简单 基本都是解压然后运行就行了 这里我们就以linu
  • 如何在十天内掌握线性代数

    最近 我的朋友斯考特 杨 Scott Young 成就了一个惊人的壮举 他在一年之内 完成了传说中的MIT计算机科学课程表的全部33门课 从线性代数到计算理论 最重要的是 他是自学的 观看在线教程讲座 并用实际的考试作自我评估 到斯考特的F
  • 时序预测

    时序预测 MATLAB实现RF 随机森林 时间序列预测 目录 时序预测 MATLAB实现RF 随机森林 时间序列预测 预测效果 基本介绍 预测准备 程序设计 主程序 训练子函数 预测子函数 参考资料 致谢 预测效果 基本介绍 在机器学习中
  • Maven依赖冲突

    依赖冲突 依赖冲突是指项目依赖的某一个jar包 有多个不同的版本 因而造成类包版本冲突 依赖传递 项目依赖了A A依赖了B 项目自动依赖了B 注意 父项目中的依赖有
  • GitHub 上最火的开源项目 —— Java 篇

    很多开发者在看到自己感兴趣的项目时会使用 Star 功能 可以说 Star 的数量在一定程度上代表了开源项目的热门程度 本文整理了 Java 语言中 star 数最多的十五款开源项目 这些项目在 GitHub 上的 star 数均超过 15
  • 开发 Leader 们最该了解的软件度量指标

    无论何时 只要是要评估或对比某些东西 就需要使用度量指标 它们是可量化的衡量标准 用于判断每个行业的进展 这其中包括软件开发 在该领域 开发负责人依靠软件度量指标来跟踪性能和生产 在我们关于如何衡量和提高开发人员工作效率的博客文章中 我们讨
  • ext 6.0开发实例二

    由于Ext JS 6将原来的Ext JS和Sencha Touch合并为一个框架 因而在使用CMD来创建应用程序前 需要考虑清楚你是要创建一个通用应用程序 还是仅仅只是针对桌面或移动设备的应用程序 要做这样的考量 是因为通用应用程序和比较单
  • 关于java/android 数据序列化后SerialVersionUID的获取

    本人android 开发 遇到了一个关于数据序列化的坑 纪录下来以便以后查看 所有需要序列化本地的bean都需要继承Serializable 否则无法序列化 如果不了解序列化的知识请自行百度 我继承了Serializable 但是没有设置S
  • 2.5.14 动态内存共享AMS

    最后更新2021 08 02 这个还算是比较实用的功能 最早介绍过CPU共享 也提到过内存共享 但CPU共享是动态 实时 按需分配的 虽然有限制条件 而内存需要用DLPar功能 收工调节 至少不是实时分配 那内存可不可以实现类似CPU的实时