Persistent Memory Development Kit


The Persistent Memory Development Kit (PMDK), formerly known as NVML, is a growing collection of libraries and tools. Tuned and validated on both Linux and Windows, the libraries build on the DAX feature of those operating systems (short for Direct Access) which allows applications to access persistent memory as memory-mapped files, as described in the SNIA NVM Programming Model.

The source for PMDK is in this GitHub repository.

The following libraries are part of PMDK:

libpmemobj

The libpmemobj library provides a transactional object store, providing memory allocation, transactions, and general facilities for persistent memory programming. Developers new to persistent memory probably want to start with this library.

See the libpmemobj page for documentation and examples.

libpmemblk

The libpmemblk library supports arrays of pmem-resident blocks, all the same size, that are atomically updated. For example, a program keeping a cache of fixed-size objects in pmem might find this library useful.

See the libpmemblk page for documentation and examples.

libpmemlog

The libpmemlog library provides a pmem-resident log file. This is useful for programs like databases that append frequently to a log file.

See the libpmemlog page for documentation and examples.

libpmemcto

The libpmemcto provides common malloc-like interfaces to persistent memory pools built on memory-mapped files, with no overhead imposed by run-time flushing or transactional updates.

NOTE: This is still an experimental API and should not be used in production environments.

See the libpmemcto page for documentation and examples.

libpmem

The libpmem library provides low level persistent memory support. The libraries above are implemented using libpmem. Developers wishing to roll their own persistent memory algorithms will find this library useful, but most developers will likely use libpmemobj above and let that library call libpmem for them.

See the libpmem page for documentation and examples.

libvmem

The libvmem library turns a pool of persistent memory into a volatile memory pool, similar to the system heap but kept separate and with its own malloc-style API.

See the libvmem page for documentation and examples.

NOTE: Since persistent memory support has been integrated into libmemkind, that library is the recommended choice for any new volatile usages, since it combines support for multiple types of volatile memory into a single, convenient API.

libvmmalloc

The libvmmalloc library transparently converts all the dynamic memory allocations into persistent memory allocations. This allows the use of persistent memory as volatile memory without modifying the target application.

See the libvmmalloc page for documentation and examples.

libpmempool

The libpmempool provides support for off-line pool management and diagnostics. Currently it provides only “check” and “repair” operations for pmemlog and pmemblk memory pools, and for BTT devices.

See the libpmempool page for documentation and examples.

pmempool

pmempool is a management tool for persistent memory pool files created by the PMDK libraries. It may be useful for system administrators as well as for software developers for troubleshooting and debugging.

See the pmempool page for available commands and documentation.

librpmem

The librpmem provides low-level support for remote access to persistent memory utilizing RDMA-capable RNICs. The library can be used to replicate content of local persistent memory regions to persistent memory on a remote node over RDMA protocol.

NOTE: This is still an experimental API and should not be used in production environments.

See the librpmem page for documentation and examples.

daxio

The daxio is a utility that performs I/O on Device DAX devices or zero a Device DAX device.

See the daxio page for available commands and documentation.

C++ bindings

The C++ bindings aim at providing an easier to use, less error prone implementation of libpmemobj. The C++ implementation requires a compiler compliant with C++11 and one feature requires C++17.

See the C++ bindings page for documentation and examples.