论文部分内容阅读
互联网时代产生了大量数据,随之催生了数据密集型应用。数据密集型应用占用大量的内存空间,且往往有数据持久化的需求。传统的计算机存储架构为易失性内存与磁盘的组合,即DRAM+DISK。数据密集型应用普遍在DRAM中进行计算以及存储热数据,并在DISK中存储结果。由于两者的读写特性存在天壤之别,应用程序反复在两者之间交换数据,既提高了软件复杂度,又降低了性能。NVM(Non-volatile memory)是一种可以随机访问的且断电后数据不丢失的存储器。一般而言,NVM相比于DRAM有数倍的空间、更低的价格,而相比于DISK则有高出若干数量级的访问性能。将各种数据密集型应用移植到NVM上将是发展趋势。本人在Intel实习期间,负责将Redis移植到一种新型NVM——3D XPoint上。然而,由于NVM与DRAM巨大的特性差异,当前主流的内存分配器都无法胜任NVM内存空间的分配。NVM内存分配器必须支持malloc_at(addr,size)分配操作,即既能指定分配的大小,又能指定分配的地址,以使得用户能够根据之前写入数据的地址重新访问到持久化在NVM上的数据,并将该数据由NVM内存分配器保护起来,不再被分配出去。本文的主要工作即设计与实现一个基于NVM的内存分配器——libnvmalloc。Libnvmalloc采用了 AVL树实现的伙伴分配器作为粗粒度分配器,使用支持二分查找的4096位bitmap作为细粒度分配器。这样的设计使得malloc()、malloc_at()和free()操作都有良好的性能。本文最后以Redis作为应用与测试案例。结果显示,当Redis利用libnvmalloc提供的功能运行在NVM上时,响应延迟和吞吐量有明显改善,对DRAM的占用量大幅降低。本文提供的libnvmalloc是一个通用的函数库,可以直接复用,为将来更多的应用移植到NVM提供了便利。