关闭

新型非易失性存储器作为交换分区的研究(能耗与性能的提升)

标签: linux能耗存储性能交换分区
204人阅读 评论(0) 收藏 举报
分类:

一. 动机

1. 移动应用功能越来越强大(pokemon Go),占用内存越来越大,功耗越来越高。同时由于Android进程管理的特性:将打开的进程缓存在后台,进程的数据包括代码,运行时数据,打开的文件缓存等统统驻留在内存。这就导致随着手机系统的使用,内存会越来越不够用。特别是对内存偏小的手机,内存不够用的情形(进程被杀死,应用程序的切换时间变长,用户体验下降)会出现的更早,更频繁。

2. 所以我们可以采用增加交换分区的方式来扩充内存容量。但是传统的交换分区会在某个时间点存在性能下降的问题,比如,在低内存情况下,应用程序的启动时间会突然变得很长。

3. 现在的内存采用的动态随机存储器(DRAM),它是一种需要动态刷新的存储器,其所产生的能耗较高。实验数据表明,在待机状态下,DRAM的功耗占到系统总功耗的30%甚至以上。所以我们要在扩增内存容量的同时,要考虑到降低功耗的要求。


二. 基本思路

该技术将一种新型的非易失性存储器作为交换分区,跟传统交换分区不同的是,这块交换分区设备要挂载到内存总线上,也就是说,可以被操作系统直接寻址找到存储单元。页面的换入换出就是通过内存拷贝的方式实现,绕开了缓慢的I/O层传输。这样可以以接近DRAM的性能来增大内存的容量,同时也可以利用NVM的低功耗的特性来降低手机系统的功耗。


三. 技术重点

1. 内存页面管理方式。

  • 采用的Linux内核中LRU链表进行冷热页面分离。页面主要由两个双向链表进行管理(分别存放活跃的和非活跃的页面):当页面才分配时,它就被从空闲链表移动到活动链表中,随着进程的执行,如果一段时间后该页面没有被使用以后,就会将页面从活跃链表移动到非活跃链表的尾部。我们要进行页面交换的目标页面就是从非活跃链表中头部获取的。这种管理方式同时这也是内核中传统的页面管理方式,所以可以很好的复用内核中的软件模块,提升兼容性。
  • 通过memcpy函数将页面从DRAM中拷贝到交换分区中。这个过程需要通过void * kmap(structpage *page)函数(一次映射一个页面,参数为struct page * page,所以传入高端内存区的物理地址,返回其线性地址(高端内存区共用128MB线性地址))提前建立一个虚拟地址到交换分区物理地址的映射,这样才能进行拷贝。

2. 页面反向映射技术。

  • try_to_unmap_anon()函数进行页框的反向映射。
  • 每个页描述符(struct page)中的mapping字段存放了该物理页框对应的anon_vma结构的地址。根据anon_vma是一个双向链表的表头,这个双向链表存放的是共享该页面的各个进程中的线性区。根据各个线性区就可以找到各个进程对应的内存描述符(mm_struct),其中就存放了该进程的页全局目录(pgd)的地址,从而可以找到对应的页表项。

3. 基于最小堆的损耗均衡算法(数据结构如下图所示:空闲页面双向链表+全局最小堆)

  • 给每一个swap slot添加一个age的标志位,用来记录该页槽被写的次数。
  • 按age大小通过一个最小堆将页槽组织起来,堆顶的页槽就是被写次数最少的swap slot;同时,用双向链表将空闲页槽组织起来,每次从链表头取页面。
  • 每次申请页面换入的时候,取空闲页面的时候,就要将取得的空闲页面与堆顶页面的age进行比较,如果没有超过阈值,则将直接进行页面换入(写页槽)。如果超过了预设阈值,就要将数据写到堆顶的页面中。如果堆顶页面是空闲页面,则直接将数据写入;如果不是空闲页面,则先将数据写入到取到的空闲页面中,然后再将要换入的数据写到堆顶的页面中。

4. 写时拷贝技术

  • 引入的目的是为了降低页面换入换出的开销,间接降低了对NVM的写。对于读请求,使得当请求的页面存在于NVM交换分区时,可以不用将页面换回内存,而是直接通过页面翻译出来的物理地址去寻址。这里利用了NVM的字节寻址的特点,同时利用了NVM的接近于DRAM的读性能。

  • 改写缺页中断函数,对于写请求,则将页面换入内存,从而直接减少对NVM区域的写操作。

四. 总结

1. 利用Linux内核内存页面冷热数据管理技术进行页面在DRAM和PCM之间的迁移,代价低,兼容性强;

2. 利用Linux页面反向映射技术解决了因迁移内存页面而带来的页表映射以及页面共享带来的问题,消除了系统死机bug;

3. 设计基于最小堆的损耗均衡算法,将写操作均衡化到PCM设备的各个物理页块上,延长了PCM使用寿命;

4. 设计写时拷贝技术,改写了内核缺页中断部分,将页面换入操作减少了40%~75%。

5. 相比传统交换分区,低内存情况下,应用程序的启动时间缩短了20%左右。

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23540次
    • 积分:664
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类