Persistent Memory Development Kit

The Persistent Memory Development Kit (PMDK) is a collection of libraries and tools. Tuned and validated on Linux OS, the libraries build on the DAX (Direct Access) feature 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 PMDK repository on GitHub is the ultimate source of information on PMDK from release 2.0! For all questions and to submit eventual issues please follow to that repository. The PMDK documentation collected here should be valid up to the 1.13.1 release but is maintained only on a best-effort basis and may not reflect the latest state of the art.

The following libraries are active parts of the PMDK.

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.

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.

The libpmem2 library provides low-level persistent memory support. The library is a new version of libpmem. libpmem2 provides a more universal and platform-agnostic interface. Developers wishing to roll their own persistent memory algorithms will find this library useful, but most developers will likely use libpmemobj above that provides memory allocation and transactions support.

See the libpmem2 page for documentation and examples.

Note: Support for experimental async functions is available only in the release 1.13.0 and before.

The libpmempool library provides support for off-line pool management and diagnostics.

See the libpmempool page for documentation and examples.

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.

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.

The pmreorder is an utility that performs a consistency check of a persistent program.

See the pmreorder page for available commands and documentation.

Discontinued projects

The following libraries are no longer maintained. If you need to use any of these projects, are interested in independently developing it, or would like to maintain patches for the open-source software community, please create your own fork for the project of interest. You will find more information here.

Note: Support for Windows and FreeBSD has been deprecated since the PMDK 1.13.0 release and was removed in the PMDK 2.0 release.

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.

Note: The libpmemblk library is available only in the release 1.13.0 and before.

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.

pmemkv is a local/embedded key-value datastore optimized for persistent memory. Rather than being tied to a single language or backing implementation, pmemkv provides different options for language bindings and storage engines.

See the pmemkv page for available documentation.

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.

Note: The libpmemlog library is available only in the release 1.13.0 and before.

libpmemset aims to provide support for persistent file I/O operations, runtime mapping concatenation and multi-part support across poolsets. It relies on synchronous event streams for pool modifications.

Note: libpmemset is available only in the release 1.12.1 and before. It is no longer available on the master branch.

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

See the libpmemset page for documentation.

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 updates

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.

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.

librpma is a C library to simplify accessing persistent memory on remote hosts over Remote Direct Memory Access (RDMA).

See the librpma page for available documentation.

Note: The librpma library release 1.3.0 is the last available release.

librpmem provides low-level support for remote access to persistent memory utilizing RDMA-capable RNICs.

See the librpmem page for documentation and examples.

Note: librpmem is available only in the release 1.12.1 and before. It is no longer available on the master branch.

Note: This is a deprecated API and should not be used in production environments.

Note: The alternative solution for accessing remote persistent memory is implemented by librpma (see above).

libvmemcache is an embeddable and lightweight in-memory caching solution. It’s designed to fully take advantage of large capacity memory, such as persistent memory with DAX, through memory mapping in an efficient and scalable way.

See the libvmemcache for current documentation.

The pmdk-convert tool performs conversion of the specified pool from the old layout versions to the newest one supported by this tool.

See the pmdk-convert for current documentation.

The contents of this web site and the associated GitHub repositories are BSD-licensed open source.