这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent Page Management for Two-tiered Main Memory。一种双层存储结构的透明巨页内存管理机制。

  随着科技的发展,新的内存技术出现了,它比普通 DRAM 更加密集和便宜,并且已经重新引起了对两级主内存方案的兴趣。我们知道,把不经常访问的应用程序数据存放在这种内存方案中,可以显著的节省成本。过去对两层主内存的研究假定页面大小为 4KB,然而,在内存占用很大的云应用中,尤其是在虚拟云环境中,2MB的巨页的性能非常关键,其中嵌套分页急剧增加 4KB 页面管理的成本。thermostat作为一种应用透明的海量页面感知机制,将页面放置在双技术混合内存系统中,同时实现了两层内存的成本优势和透明的海量内存的性能优势。

  文章中主要完成的工作概括之后如下:

1. 提出了一种在线的低开销的机制,用于处理由于在缓慢的内存中放置一个特定页面而导致的性能下降。

2.使用这个机制在一个在线的热/冷页面分类系统,只需要一个最大内存成本下降目标作为输入。

3. 提出了一种在线方法来检测和纠正错误分类,从而最小化这种错误分类对应用程序吞吐量的影响。

4. 通过模拟软件中的缓慢内存,最终证明了恒温器可以迁移到高达 50% 的云应用程序。

4. 通过模拟软件中的缓慢内存,最终证明了恒温器可以迁移到高达 50% 的云应用程序。他们提出了thermostat,这是一种对于应用透明的海量页面感知机制,模拟了接近未来高密度内存技术的性能特性的慢内存,并实验将thermostat迁移到应用程序的内存,虽然性能下降限制3%,但是内存成本降低了30%。我对于这篇文章的分析主要集中在thermostat机制的实现。首先,如何有效、透明地使用缓慢的内存来降低成本而不会造成大量的性能损失,是一项挑战。任何内存放置策略都必须估计与将给定的内存页放置,所以在慢速内存中相关的性能会有一定的损失,而且还需要一些方法来衡量页面访问速度。当前 x86 硬件中缺乏准确的页面访问速率跟踪,这使得这项任务具有挑战性。此外,我们将显示,基于现有硬件维护的访问位将页面放置到缓慢内存的方法是不够的,并可能导致严重的性能退化。当前 x86 硬件中缺乏准确的页面访问速率跟踪,这使得这项任务具有挑战性。此外,我们将显示,基于现有硬件维护的访问位将页面放置

  文章中提出了thermostat,这是一种对于应用透明的海量页面感知机制,模拟了接近未来高密度内存技术的性能特性的慢内存,并实验将thermostat迁移到应用程序的内存,虽然性能下降限制3%,但是内存成本降低了30%。我对于这篇文章的分析主要集中在thermostat机制的实现。

  首先,如何有效、透明地使用缓慢的内存来降低成本而不会造成大量的性能损失,是一项挑战。任何内存放置策略都必须估计与将给定的内存页放置,所以在慢速内存中相关的性能会有一定的损失,而且还需要一些方法来衡量页面访问速度。当前 x86 硬件中缺乏准确的页面访问速率跟踪,这使得这项任务具有挑战性。此外,我们将显示,基于现有硬件维护的访问位将页面放置到缓慢内存的方法是不够的,并可能导致严重的性能退化。

  巨页,概括起来,就是在内核页面大小一定的情况下,分配物理地址连续的多个页框,模拟出一个大页面供用户态程序访问,从而减少用户程序缺页次数,提高性能。

  thermostat设置了透明的巨页,内核试图尽可能的分配hugepages,如果mmap区域是2MB自然对其的,那么任何Linux进程都将映射到2MB的页面。主内核地址空间本身被映射为一张巨页,从而降低了内核代码TLB的压力。内核总是尝试使用hugepages来满足内存分配。如果没有hugepages可用(例如,物理连续内存不可用),内核将返回到常规的4KB页面。透明巨页也可交换,这是通过将大页面拆分为较小的4KB页面来实现的,然后正常交换。但是为了有效地使用Hugepages,内核必须找到物理上连续的内存区域,这些内存区域必须足够大以满足请求,并且必须适当地对齐。为此,添加了一个khugepaged内核线程。这个线程偶尔会尝试用一个巨大的页面分配来替换当前正在使用的较小的页面,从而最大限度地提高THP的使用率。

  热页面和冷页面是一项提高数据缓冲效率的技术。这项技术对于每一个CPU的每一个管理区,都会提供两个数据页队列:热队列和冷队列。热页面可以理解成经常访问的页面,而冷页面对应的是不经常访问的页面。他们可以在一个锁定的条件下对于多个数据页进行操作,默认的情况是一次16个。队列会存在一个高水位和一个低水位,如果页面数小于低水位,那么队列会重新充满,如果高于高水位,队列会被清空,对于热队列来说,一般值为32~96,而冷队列为0~32.热队列的管理是后进先出,收集的是通过free_pages()释放的内存页面。冷队列收集的是CPU请求可是没有被马上使用的页面,例如DMA操作一次读入的一些页面。冷队列保留了热页面中有价值的页面以及一个缓冲行中暂时没有使用的页面,这些页面来自shrink_list(),shrink_cache()和refill_inactive_zone()。

  通过模拟软件中的缓慢内存,最终证明了恒温器可以迁移到高达 50% 的云应用程序。他们提出了thermostat,这是一种对于应用透明的海量页面感知机制,模拟了接近未来高密度内存技术的性能特性的慢内存,并实验将thermostat迁移到应用程序的内存,虽然性能下降限制3%,但是内存成本降低了30%。我对于这篇文章的分析主要集中在thermostat机制的实现。首先,如何有效、透明地使用缓慢的内存来降低成本而不会造成大量的性能损失,是一项挑战。任何内存放置策略都必须估计与将给定的内存页放置,所以在慢速内存中相关的性能会有一定的损失,而且还需要一些方法来衡量页面访问速度。当前 x86 硬件中缺乏准确的页面访问速率跟踪,这使得这项任务具有挑战性。此外,我们将显示,基于现有硬件维护的访问位将页面放置到缓慢内存的方法是不够的,并可能导致严重的性能退化。当前 x86 硬件中缺乏准确的页面访问速率跟踪,这使得这项任务具有挑战性。此外,我们将显示,基于现有硬件维护的访问位将页面放置

  thermostat由四个部分组成:

1. 一种抽样机制:随机选择访问速率监视页面子集。

2. 一种监视机制:在限制最大开销的同时计算访问抽样页面的次数。

3. 一种置换策略:用于将页面放置在缓慢内存中的分类策略。

4. 一种内存机制:监控和检测错误分类页面或行为更改,并将页面迁移回传统的内存。

  thermostat必须解决的关键挑战是,首先要以足够低的开销识别 2MB 页的访问速度,同时仍然能够快速响应不断变化的负载行为。其次,如果经常访问页面,跟踪页面的访问速度可能会非常昂贵。所以,为了约束访问速率监视的性能影响,任何时候都只能监视应用程序占用空间的一小部分。

  关于各部分的具体实现,我的概括如下:

1. 首先要设计并实现页面抽样。可以采样大量的巨大页面,但是它可能导致高性能开销。因为每个TLB错过 sam-pled 页面会导致操作系统错误处理的额外延迟。为了严格控制应用程序性能放缓,最终文章将巨大页面的随机样本分割为 4KB页,并且在每个采样间隔内只检测这些 4KB 页的一小部分。

具体的选择策略是:对于某些固定的K,选择K随机4KB页面。然而,当一个巨大的页面中只有几个 4KB 的页面是热的,由于相较于热页面的数量,K值可能过大,这种策略无法对它们进行采样,从而认为整个巨大的页面具有较低的访问速度。为了解决这个缺点,文章将分两步监控页面访问速率。首先,依赖硬件维护的访问比特来监控所4KB的页面,并识别那些具有非零访问速率的页面。然后,使用成本更高的软件机制监视这些页面的示例,以准确估计2MB页面的总访问速率。使用这种策略,任何时候只有 0.5% 的内存被采样,这使得由于采样 <1% 的性能开销。

2. 计算访问抽样页面的次数。当前x86硬件不支持每页粒度的访问计数。因此,文章中设计了一个仅适用于软件的解决方案,通过使用 PTE 预留位来跟踪开销非常低 (<1%) 的页面访问速率。为了近似访问页面的次数,测试人员使用BadgerTrap,拦截TLB错误的内核扩展。当对访问计数的页面进行采样时,thermostat通过设置保留位来用于计数,然后从TLB获取数据,刷新计数。下一次访问该页面将导致硬件页面缺失,然后触发保护故障,最后由 BadgerTrap截获。通过计算 BadgerTrap错误的数量,可以估计TLB丢失到页面的次数,将其作为内存访问次数的代理。

3. 之后实现将页面放置在缓慢内存中的分类策略。基于用户输入的目标,也就是最大可容忍的内存损失,将页面分类为热或冷。为了选择出冷页面,文章中计算了一种访问巨页的访问率。具体的计算过程如下,首先假设用户设置的最低可容忍内存损失为x%,第A次访问内存,是访问到内存的时延,是访问内存需要的总时间。所以最低可容忍内存损失,可以理解成最低的内存访问率是,然后对采样的海量页面进行排序,使其估计的访问速率呈递增顺序,然后将最冷的页面置于缓慢内存中,直到总访问速率达到目标阈值。

这种简单的方法控制访问速度以减缓内存以避免用户指定的降级目标。下图给出了缓存访问速度平均超过30秒,假设1us缓慢内存访问延迟和 3% 可容忍最低内存损失,我们观察到,thermostat保持缓慢的内存访问速度接近目标30K 。对于Aerospike和 Cassandra,thermostat缓慢的内存访问速度暂时超过 30 K。

4. 最后一步是实现对于错误分类页面的更正策略。

由于仅根据少数4KB页面的访问率来估计一个大页面的访问率,所以总是有可能一些热的大页面由于采样错误而被误归类为冷的。这种错误分类对应用程序性能不利,因为任何给定的大页面的连续采样间隔可能相当长。

为了解决这个问题,文章中使用之前提到的软件机制跟踪访问每个冷的大页面的次数。由于这些页面的访问速度在设计上很慢,因此此监视的性能影响很低。在每个采样周期中,根据慢内存中的大页面的访问计数对其进行排序,并将它们的总访问计数与慢内存的目标访问率进行比较。然后,最频繁访问的页面将被迁移回快速内存,直到剩余冷页面的访问率低于阈值。除了任何错误分类的页面之外,此机制还标识随时间变热的页面,适应应用程序热工作集的更改。

之后作者们对于thermostat进行了实现,并测试了实际性能,占了一半的篇幅。

随着Intel/Micron最近宣布推出3D Xpoint内存,数据中心有机会降低内存成本,提高容量和每比特成本。但是,由于这些新内存技术预计会有更高的访问延迟,因此完全取代主内存DRAM技术是不可行的。本文提出并评估了thermostat,一种基于应用程序透明的双层存储结构的透明巨页内存管理机制,用于将页放置在双技术混合内存系统中,同时实现两层内存的成本优势和透明大页的性能优势。

在内存占用较大的云应用程序中,特别是在虚拟化云环境中,需要在这两层内存系统中支持性能关键的巨大页面。文章中针对此问题,提出了一种新的热/冷分类机制来区分频繁访问的页面(hot)和不频繁访问的页面(cold)。

最后,作者们在Linux内核版本4.5中实现了恒温器,并表明它可以透明地将冷数据移动到慢内存中,同时满足3%的可容忍的速度减慢。文章最终表明,在线冷页识别机制不会产生明显的性能开销,并且可以迁移到50%的应用程序,同时将应用程序占用空间减少到3%,同时将性能下降限制在3%,从而将内存成本降低到30%。

Thermostat:双层存储结构的透明巨页内存管理机制的更多相关文章

  1. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  2. 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...

  3. linux 内核源代码情景分析——i386 的页式内存管理机制

    可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...

  4. Linux大页内存管理等---菜鸟初学

    1. 查看linux的内存情况: free -m 2. 查看是否开启大页的方法: cat /proc/meminfo |grep -i HugePage AnonHugePages: 276480 k ...

  5. 【Debian百科】巨页

    巨页 为什么使用巨页? 当一个进程使用一些内存的时候,CPU就把那部分内存标记成已被该进程使用的.为了提高效率,CPU会按4K字节块(它在很多平台上是默认值)分配内存.这些块被称作页.这些页可以被交换 ...

  6. ORACLE数据库存储结构简介(转)

    首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的.   逻辑存储结构:oracle内部的组织和管理数据的方式.  物理存储结构:o ...

  7. oracle逻辑存储结构

    oracle数据库管理系统有三个重要的概念:实例.数据库.数据库服务器.oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构.逻辑存储结构用于描绘Oracle内部组织和管理数据的方式,而物理 ...

  8. 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构

    目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...

  9. Oracle 存储结构

    数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...

随机推荐

  1. redis-dump实现redis库迁移

    最近公司有切换redis库的需求,找了个简单的redis迁移方法,不过也有缺点.就是对于实时性要求很高的redis库迁移无法做到数据的实时同步.不过对于简单的redis库备份和迁移还是可以的,各位看官 ...

  2. MySQL 数据库死锁

    数据库死锁 死锁的解决办法(1) 执行下面SQL,先查看哪些表被锁住了: select b.owner,b.object_name,a.session_id,a.locked_mode from v$ ...

  3. Luogu P5284 [十二省联考2019]字符串问题

    好难写的字符串+数据结构问题,写+调了一下午的说 首先理解题意后我们对问题进行转化,对于每个字符串我们用一个点来代表它们,其中\(A\)类串的点权为它们的长度,\(B\)类串的权值为\(0\) 这样我 ...

  4. FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件

    本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...

  5. UEditor单图上传跨域问题解决方案

    UEditor UEditor是百度团队提供的富文本编辑器 git地址为:https://github.com/fex-team/ueditor 在最近的项目中使用了该插件作为项目的富文本编辑器 由于 ...

  6. dubbo-springboot入门级demo

    1. dubbo-springboot入门级demo 1.1. 前言 最后一个做运维的朋友和我提起,他们公司想做个dubbo灰度发布的功能,而这个功能落到了他头上.在我的印象里,dubbo应该可以通过 ...

  7. IIS系统短文件名漏洞猜解过程

    今天看教程的时候,老师关于后台管理说到了短文件名漏洞,我就随便找了个网站猜解,可能是运气太好了,有了这次实践的过程,因为这个漏洞是13年的时候比较火,现在差不多都修复了,抓到一条漏网之鱼, 短文件名漏 ...

  8. Litepal【开源数据库ORM框架】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 好用的数据库框架. 效果图 代码分析 本篇主要是整理Litepal的引入和增删改查的简单操作,具体使用请阅读参考资料. 使用步骤 一 ...

  9. LindDotNetCore~职责链模式的应用

    回到目录 职责链模式 它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择! 下面是官方标准的定义:责任链模式是一种设计模式.在责任链模 ...

  10. Vue不能检测数组或对象变动问题的解决

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...