编写基于持久内存的软件听上去是一件非常复杂的事情,是的没错,研发或者测试过持久内存代码的人都可以证明这一点。因此社区开源了持久内存开发套件(PMDK)。看上去和我们所熟悉的JDK、SDK是一类东西。PMDK就是这样一个库,适用于所有的持久内存(厂商中立),简化开发并解决一些常见挑战。
PMDK 的全称是 Persistent Memory Development Kit,它包含了 Intel 开发的一系列旨在 方便非易失性内存的应用开发的函数库和工具。实际上,PMDK 的 github仓库中包含了 libpmem、libvmem、libpmemblk、libpmemlog、libpmemobj、libpmempool、libvmmalloc 等很多函数库。
PMDK 包含了一系列的的函数库和工具,它们分别对应不同的应用场景。从易用性和收益两个维度分别来 看,随着函数库使用难度的增加,采用它所获得的性能也有对应的提升。

持久内存开发套件 (PMDK), 前身为NVML,是持续丰富的开发库和工具的集合。这些库在 Linux 和 Windows 上进行调整和验证后,以这些操作系统的 DAX 功能(直接访问)为基础,允许应用程序访问持久内存作为内存映射文件,如SNIA NVM 编程模型所述。

重要原则
只要满足应用的需求,就尽可能使用最高的抽象级别。
PMem可以更快的速度执行小型数据写入!
可通过直接访问(DAX I/O)和标准文件系统 I/O路径访问pmem。
- 持久内存可以透明地被访问,PMDK关注内存式访问,应用管理字节可寻址的数据结构。
- pmdk关注持久性的用例,因而必须保证pmem中的数据结构不会受到系统崩溃和断电的影响。
- 对于fsdax而言,文件系统用于查找持久内存文件和进行权限检查,随后它就会离开应用的数据路径。
- 因为pmem性能可能比DRAM慢,因此应用程序应决定将哪些数据保存在DRAM、PMem和硬盘中。
- 工作数据集的大小在DRAM和PMem的容量范围内有利于显著提升性能,无需分页或网络传输。
- 持久内存可字节寻址,按需更新,不会产生读取-修改-写入的开销。
库简介
-
libmemkind
libmemkind库是易失性的库,是构建在jemalloc之上的用户可拓展堆管理器,支持控制内存特性以及在不同类型的内存之间堆堆进行分区。 -
libvmemcache
libvmemcache是一种可嵌入式的轻量级内存缓存解决方案,可以通过高效、可拓展的内存映射,充分利用大容量存储,例如支持DAX的持久内存。这是一个单独的开源项目。 -
libvmem
libvmem是libmemkind的前身,目前不再使用了。 -
libpmem
libpmem是一种低级别C库,可针对操作系统呈现的原语提供基本抽象功能。它可以自动检测平台中的功能。 -
libpmemobj
libpmemobj库提供事务对象存储,为持续内存编程提供内存分配、事务和常规功能。初识持久内存的开发人员可能希望从此库开始旅程,这个库很重要。 -
libpmemobj-cpp
这个库也称为libpmemobj++,是一种C++ header-only 库,可以使用C++元编程特性,提供更简单更不易出错的接口。 -
libpmemkv
libpmemkv是为持久内存而优化设计的通用嵌入式本地键值存储。它易于使用,且附带许多不同的语言集成,包括C++和javascript。该库还有面向不同存储引擎的可插拔后端插件。 -
libpmemlog
libpmemlog能够实现持久内存仅可追加的日志文件(append-only log file),且支持断电保护操作。 -
libpmemblk
仅用于需要简单固定数据块数组。
工具和命令行
- pmempool
用于管理和离线分析持久内存池的工具。具备很多功能,可用在应用程序的整个生命周期。 - pmemcheck
适用于使用libpmemobj、libpmem或者libpmemobj-cpp开发应用程序的情况,可以帮助我们查找持久应用程序中的常见漏洞。建议将pmemcheck测试加入PMDK的持续集成系统中去。 - pmreorder
可帮助检测持久应用程序的数据结构一致性问题。
网友评论