AIFM: High-Performance, Application-Integrated Far Memory

Introduction

背景

数据中心对于内存的需求是非常大,谷歌和阿里的数据中心的内存占用大概是的60%。内存不够的话,一些应用就必须要被杀死。为了缓解这个问题,SWAP机制就被提出了,将没有被使用的内存页卸载到硬盘或者是远端的内存中

问题

SWAP的粒度比较大,以4KB为粒度。并且SWAP是通过page fault完成的,这会导致CPU额外的开销(对于Fastswap的后台RDMA来说大概是15-20k的CPU cycle)

key insight

提出一种AIFM(application-integrated far memor)的机制,在应用程序层面完成swap,而不是在虚拟内存层面。开发者可以在写数据结构时指定是Local还是remote(指向 remote memory)。

当内存压力大时,本地的一些对象会被swap out,指向这些对象的指针会被修改为远程的。当需要引用这些远程的对象时,AIFM会启动一些轻量的线程将这些对象加载到本地,并且该线程此时会将资源提供给其他线程使用(传统linux则是会继续运行该线程,以避免线程切换开销)

  1. 一种低开销的远程指针抽象
  2. 不会暂停的内存疏导(remote swap)
  3. 可以在运行时进行数据结构语义传递的API
  4. 远端设备用来将数据存放到内存的接口

OS swapping and far memory :

swap是内核虚拟内存的子系统,并且对于用户态的应用是透明的。最小的粒度是4KB,即便对象实际的内存大小是小于4KB的。并且在原有的swap机制中获得一些应用运行的语义也是非常困难的,只能通过madvise完成。AIFM借鉴了c++中弱指针的概念,提出了一个可以指向远端内存的指针,并且粒度可以不为4KB

Disaggregated and distributed shared memory

分类存储的硬件问题尚未解决,AIFM提供一种软件的解决方法

分布式存储中数据实在不同的主机中共享的,每次对于数据访问都要确认远端的缓存是否存在这个数据,这样非常复杂且不方便。AIFM中做了一个简化,数据只属于一个主机

Motivation

image

AIFM可以获得更低的延迟

AIFM Design

对于数据结构、类的编写者来说可以利用AIFM提供的API去指定数据是在本地还是远程
对于app 开发者不需要去关心是不是本地还是远程,只需要使用就行

Remoteable Memory Abstractions

Remoteable Pointers

针对远程指针以及本地指针设计了不同的形式,并且支持c++ 11的unique_ptr and shared_ptr

image

Dereference Scopes

当访问远程对象时一定要先申明一个作用域,这也是使用AIFM的API的标志

Evacuation Handlers

可用于自定义疏散的执行,用于处理swap out本地对象中嵌入式的unique指针

AIFM Runtime

隐藏远程访问的延迟

采用mutator thread机制,一个暂停,其他继续运行

采取预取机制,预测将要被使用的object

测试

image

图的横轴是内存访问后CPU的计算时间,可以看到和fastswap相比,AIFM的延迟更低

c++ 11智能指针

unique_ptr and shared_ptr https://blog.csdn.net/king_way/article/details/95536938