SlideShare a Scribd company logo
Key/Value Store for Persistent Memory
Rob Dickinson -- pmemkv Technical Lead
SPDK, PMDK & Vtune™ Summit
Agenda
• Why pmemkv?
• Key/Value API
• Language Bindings
• Storage Engines
• Roadmap
2
SPDK, PMDK & Vtune™ Summit 3
Persistent memory programming is difficult
There are many languages in the cloud
Key/value datastores are increasingly popular
→ Large addressable market of cloud developers
for an easy KV store for persistent memory
whypmemkv?
SPDK, PMDK & Vtune™ Summit 4
Technical:
Local key/value store (no networking)
Idiomatic language bindings
Simple, familiar, bulletproof API
Easily extended with new engines
Optimized for persistent memory
(limit copying to/from DRAM)
Flexible configuration, not limited to a
single storage algorithm
Community:
Open source, developed in the open
Friendly licensing
Outside contributions are welcome
Collaboration alternative for folks
frustrated with other OS projects
Intel provides stewardship, validation on
real hardware, and code reviews
Standard/comparable benchmarks
goalsforpmemkv
SPDK, PMDK & Vtune™ Summit 5
Engine Lifecycle:
Start ( engine_name, json_config ) → engine
Stop ( engine )
Engine Operations:
engine.Put ( key, value )
engine.Get ( key, value_or_callback )
engine.Exists ( key ) → true/false
engine.Remove ( key )
Iteration Operations: (optional)
engine.Count ( ) → count
engine.All ( key_callback )
engine.Each ( key_and_value_callback )
plus range iteration versions of these!
simple&portablekey/valueAPI
SPDK, PMDK & Vtune™ Summit 6
pmemkvsampleprogram -- C++
int main()
{
KVEngine* kv = KVEngine::Start("vsmap", "{"path":"/dev/shm/"}");
KVStatus s = kv->Put("key1", "value1");
assert(s == OK && kv->Count() == 1);
string value;
s = kv->Get("key1", &value);
assert(s == OK && value == "value1");
kv->All([](const string& k) { LOG(" visited: " << k); });
s = kv->Remove("key1");
assert(s == OK && !kv->Exists("key1"));
delete kv;
return 0;
}
SPDK, PMDK & Vtune™ Summit 7
Implementations:
C++ (core)
C (extern "C" on C++ core)
Java (v8 or higher)
NodeJS (v6.10 or higher)
Ruby (v2.2 or higher)
Python (coming soon!)
Goals:
No modifications to languages or
runtime environments
Designed for multi-language use
Familiar object model
Familiar error handling
Language-specific types
Heap offloading (where applicable)
Consistent unit tests
IdiomaticLANGUAGEBINDINGS
SPDK, PMDK & Vtune™ Summit 8
pmemkvsampleprogram -- JAVA
public static void main(String[] args)
{
KVEngine kv = new KVEngine("vsmap", "{"path":"/dev/shm/"}");
kv.put("key1", "value1");
assert kv.count() == 1;
assert kv.get("key1").equals("value1");
kv.all((String k) -> System.out.println(" visited: " + k));
kv.remove("key1");
assert !kv.exists("key1");
kv.stop();
}
NOTE:
Binding based on JNI
Throw exception on error
Supports String, byte[] and ByteBuffer
Overloaded iterator methods/types
SPDK, PMDK & Vtune™ Summit 9
pmemkvsampleprogram -- nodejs
const kv = new KVEngine('vsmap', '{"path":"/dev/shm/"}');
kv.put('key1', 'value1');
assert(kv.count === 1);
assert(kv.get('key1') === 'value1');
kv.all((k) => console.log(` visited: ${k}`));
kv.remove('key1');
assert(!kv.exists('key1'));
kv.stop();
NOTE:
Maintained by Intel JSTC
Binding based on NAPI
Throw exception on error
Buffer support coming soon!
SPDK, PMDK & Vtune™ Summit 10
pmemkvsampleprogram -- RUBY
kv = KVEngine.new('vsmap', '{"path":"/dev/shm/"}')
kv.put('key1', 'value1')
assert kv.count == 1
assert kv.get('key1').eql?('value1')
kv.all_strings {|k| puts " visited: #{k}"}
kv.remove('key1')
assert !kv.exists('key1')
kv.stop
NOTE:
Binding based on FFI
Throw exception on error
Supports string & byte array
Iterator methods with type names
SPDK, PMDK & Vtune™ Summit 11
sourcesoflatencyWithinHIGH-LEVELBINDINGS
• # of round trips between high-level language & native code
• pmemkv language bindings (one round trip per operation)
• Copy key/value data between persistent memory and high-level object
• Create high-level object (string, byte[], reference type, callback/closure)
• Depending on the type of high-level object…
• Translate bytes to UTF-8
• String interning, reference counting or GC
• pmemkv core (native code)
• Searching indexes in DRAM
• Updating indexes in DRAM
• Managing transactions
• Allocating persistent memory
• Persistent Memory (read & write latencies)
SPDK, PMDK & Vtune™ Summit 12
relativeperformanceofBINDINGS
NOTE: Single-threaded benchmarks on emulated persistent memory, 16 byte keys & values,
C++ all/each pass pointers only, C++ & Java benchmarks use pre-generated keys,
Ruby & NodeJS bindings use UTF-8 strings built during the benchmark
SPDK, PMDK & Vtune™ Summit 13
relativeperformanceofBINDINGS
NOTE: Single-threaded benchmarks on emulated persistent memory, 16 byte keys & values,
C++ all/each pass pointers only, C++ & Java benchmarks use pre-generated keys,
Ruby & NodeJS bindings use UTF-8 strings built during the benchmark
SPDK, PMDK & Vtune™ Summit 14
Implementations:
cmap (PMDK concurrent map)
vsmap (memkind)
vcmap (memkind)
tree3 / stree (experimental)
caching (experimental)
Goals:
Applications can use multiple engines
Engines are optimized for different
workloads & capabilities (threading,
persistence, iterating, sorting)
All engines work with all utilities and
language bindings
Engines can use other engines
Engines from the community
storageengines
SPDK, PMDK & Vtune™ Summit 15
AVAILABLEENGINES
SPDK, PMDK & Vtune™ Summit 16
contributingENGINESiseasy
https://github.com/pmem/pmemkv/blob/master/CONTRIBUTING.md#engines
SPDK, PMDK & Vtune™ Summit 17
1.0 Release:
C/C++, Java, JavaScript, Ruby bindings
cmap, vmap, vcmap engines
Automated tests & CI environment
pmemkv_bench (port of db_bench)
Q2 2019 (estimated)
1.1 Release:
Python bindings
csmap, caching engines
Third-party engines?
Pool partitioning
Q4 2019 (estimated)
pmemkvroadmap
SPDK, PMDK & Vtune™ Summit 18
calltoaction
Star/watch us on GitHub! https://github.com/pmem/pmemkv
Persistent Memory Programming with Pmemkv

More Related Content

PDF
Provision Intel® Optane™ DC Persistent Memory in Linux*
PDF
Volatile Uses for Persistent Memory
PDF
Persistent Memory Programming with Java*
PDF
Reconnaissance of Virtio: What’s new and how it’s all connected?
PDF
Debugging Tools & Techniques for Persistent Memory Programming
PDF
Ceph Day Beijing - SPDK for Ceph
PPSX
Rendering Battlefield 4 with Mantle by Yuriy ODonnell
PDF
Using GPUs to handle Big Data with Java by Adam Roberts.
Provision Intel® Optane™ DC Persistent Memory in Linux*
Volatile Uses for Persistent Memory
Persistent Memory Programming with Java*
Reconnaissance of Virtio: What’s new and how it’s all connected?
Debugging Tools & Techniques for Persistent Memory Programming
Ceph Day Beijing - SPDK for Ceph
Rendering Battlefield 4 with Mantle by Yuriy ODonnell
Using GPUs to handle Big Data with Java by Adam Roberts.

What's hot (20)

PDF
Implementing distributed mclock in ceph
PDF
Improving the Performance of the qcow2 Format (KVM Forum 2017)
PPT
Kgdb kdb modesetting
PDF
An Introduction to OpenCL™ Programming with AMD GPUs - AMD & Acceleware Webinar
PPTX
Nytro-XV_NWD_VM_Performance_Acceleration
PDF
Trip down the GPU lane with Machine Learning
PDF
PostgreSQL with OpenCL
PDF
Computer Vision Powered by Heterogeneous System Architecture (HSA) by Dr. Ha...
PPSX
Rendering Battlefield 4 with Mantle by Johan Andersson - AMD at GDC14
PDF
Extreme Linux Performance Monitoring and Tuning
PDF
Computing Performance: On the Horizon (2021)
PDF
Persistent Memory Development Kit (PMDK) Essentials: Part 2
PPSX
Gcn performance ftw by stephan hodes
PDF
RapidFire - the Easy Route to low Latency Cloud Gaming Solutions - AMD at GDC14
PDF
Achieving the Ultimate Performance with KVM
PDF
Debugging Hung Python Processes With GDB
PPTX
Intro to GPGPU with CUDA (DevLink)
PDF
ZFSperftools2012
PDF
DirectGMA on AMD’S FirePro™ GPUS
Implementing distributed mclock in ceph
Improving the Performance of the qcow2 Format (KVM Forum 2017)
Kgdb kdb modesetting
An Introduction to OpenCL™ Programming with AMD GPUs - AMD & Acceleware Webinar
Nytro-XV_NWD_VM_Performance_Acceleration
Trip down the GPU lane with Machine Learning
PostgreSQL with OpenCL
Computer Vision Powered by Heterogeneous System Architecture (HSA) by Dr. Ha...
Rendering Battlefield 4 with Mantle by Johan Andersson - AMD at GDC14
Extreme Linux Performance Monitoring and Tuning
Computing Performance: On the Horizon (2021)
Persistent Memory Development Kit (PMDK) Essentials: Part 2
Gcn performance ftw by stephan hodes
RapidFire - the Easy Route to low Latency Cloud Gaming Solutions - AMD at GDC14
Achieving the Ultimate Performance with KVM
Debugging Hung Python Processes With GDB
Intro to GPGPU with CUDA (DevLink)
ZFSperftools2012
DirectGMA on AMD’S FirePro™ GPUS
Ad

Similar to Persistent Memory Programming with Pmemkv (20)

PDF
Persistent Memory Development Kit (PMDK): State of the Project
PDF
Create C++ Applications with the Persistent Memory Development Kit
PDF
C++ Programming and the Persistent Memory Developers Kit
PDF
Hidden pearls for High-Performance-Persistence
PPTX
The Forefront of the Development for NVDIMM on Linux Kernel
PDF
Persistent Memory Development Kit (PMDK) Essentials: Part 1
PDF
JavaOne 2015 CON7547 "Beyond the Coffee Cup: Leveraging Java Runtime Technolo...
PDF
Vector Database Systems Basic Essentials
PDF
In-Memory Computing - The Big Picture
PDF
Challenges in Maintaining a High Performance Search Engine Written in Java
PDF
JavaOne-2013: Save Scarce Resources by Managing Terabytes of Objects off-heap...
PPTX
Introduction to Polyglot Persistence
PDF
4Developers 2018: The turbulent road to byte-addressable storage support at t...
PDF
Collections forceawakens
PDF
Software Design for Persistent Memory Systems
PDF
20160811 s301 e_prabhat
PDF
DConf2015 - Using D for Development of Large Scale Primary Storage
PDF
Kyotoproducts
PPT
10 interesting things about java
PPT
Live Memory Forensics on Android devices
Persistent Memory Development Kit (PMDK): State of the Project
Create C++ Applications with the Persistent Memory Development Kit
C++ Programming and the Persistent Memory Developers Kit
Hidden pearls for High-Performance-Persistence
The Forefront of the Development for NVDIMM on Linux Kernel
Persistent Memory Development Kit (PMDK) Essentials: Part 1
JavaOne 2015 CON7547 "Beyond the Coffee Cup: Leveraging Java Runtime Technolo...
Vector Database Systems Basic Essentials
In-Memory Computing - The Big Picture
Challenges in Maintaining a High Performance Search Engine Written in Java
JavaOne-2013: Save Scarce Resources by Managing Terabytes of Objects off-heap...
Introduction to Polyglot Persistence
4Developers 2018: The turbulent road to byte-addressable storage support at t...
Collections forceawakens
Software Design for Persistent Memory Systems
20160811 s301 e_prabhat
DConf2015 - Using D for Development of Large Scale Primary Storage
Kyotoproducts
10 interesting things about java
Live Memory Forensics on Android devices
Ad

More from Intel® Software (20)

PPTX
AI for All: Biology is eating the world & AI is eating Biology
PPTX
Python Data Science and Machine Learning at Scale with Intel and Anaconda
PDF
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
PDF
AI for good: Scaling AI in science, healthcare, and more.
PDF
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
PPTX
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
PPTX
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
PPTX
AWS & Intel Webinar Series - Accelerating AI Research
PPTX
Intel Developer Program
PDF
Intel AIDC Houston Summit - Overview Slides
PDF
AIDC NY: BODO AI Presentation - 09.19.2019
PDF
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
PDF
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
PDF
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
PDF
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
PDF
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
PDF
AIDC India - AI on IA
PDF
AIDC India - Intel Movidius / Open Vino Slides
PDF
AIDC India - AI Vision Slides
PDF
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
AI for All: Biology is eating the world & AI is eating Biology
Python Data Science and Machine Learning at Scale with Intel and Anaconda
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
AI for good: Scaling AI in science, healthcare, and more.
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
AWS & Intel Webinar Series - Accelerating AI Research
Intel Developer Program
Intel AIDC Houston Summit - Overview Slides
AIDC NY: BODO AI Presentation - 09.19.2019
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
AIDC India - AI on IA
AIDC India - Intel Movidius / Open Vino Slides
AIDC India - AI Vision Slides
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...

Recently uploaded (20)

PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Electronic commerce courselecture one. Pdf
PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Sensors and Actuators in IoT Systems using pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Weekly Chronicles - August'25 Week I
madgavkar20181017ppt McKinsey Presentation.pdf
GamePlan Trading System Review: Professional Trader's Honest Take
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Chapter 3 Spatial Domain Image Processing.pdf
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Electronic commerce courselecture one. Pdf
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
Sensors and Actuators in IoT Systems using pdf

Persistent Memory Programming with Pmemkv

  • 1. Key/Value Store for Persistent Memory Rob Dickinson -- pmemkv Technical Lead
  • 2. SPDK, PMDK & Vtune™ Summit Agenda • Why pmemkv? • Key/Value API • Language Bindings • Storage Engines • Roadmap 2
  • 3. SPDK, PMDK & Vtune™ Summit 3 Persistent memory programming is difficult There are many languages in the cloud Key/value datastores are increasingly popular → Large addressable market of cloud developers for an easy KV store for persistent memory whypmemkv?
  • 4. SPDK, PMDK & Vtune™ Summit 4 Technical: Local key/value store (no networking) Idiomatic language bindings Simple, familiar, bulletproof API Easily extended with new engines Optimized for persistent memory (limit copying to/from DRAM) Flexible configuration, not limited to a single storage algorithm Community: Open source, developed in the open Friendly licensing Outside contributions are welcome Collaboration alternative for folks frustrated with other OS projects Intel provides stewardship, validation on real hardware, and code reviews Standard/comparable benchmarks goalsforpmemkv
  • 5. SPDK, PMDK & Vtune™ Summit 5 Engine Lifecycle: Start ( engine_name, json_config ) → engine Stop ( engine ) Engine Operations: engine.Put ( key, value ) engine.Get ( key, value_or_callback ) engine.Exists ( key ) → true/false engine.Remove ( key ) Iteration Operations: (optional) engine.Count ( ) → count engine.All ( key_callback ) engine.Each ( key_and_value_callback ) plus range iteration versions of these! simple&portablekey/valueAPI
  • 6. SPDK, PMDK & Vtune™ Summit 6 pmemkvsampleprogram -- C++ int main() { KVEngine* kv = KVEngine::Start("vsmap", "{"path":"/dev/shm/"}"); KVStatus s = kv->Put("key1", "value1"); assert(s == OK && kv->Count() == 1); string value; s = kv->Get("key1", &value); assert(s == OK && value == "value1"); kv->All([](const string& k) { LOG(" visited: " << k); }); s = kv->Remove("key1"); assert(s == OK && !kv->Exists("key1")); delete kv; return 0; }
  • 7. SPDK, PMDK & Vtune™ Summit 7 Implementations: C++ (core) C (extern "C" on C++ core) Java (v8 or higher) NodeJS (v6.10 or higher) Ruby (v2.2 or higher) Python (coming soon!) Goals: No modifications to languages or runtime environments Designed for multi-language use Familiar object model Familiar error handling Language-specific types Heap offloading (where applicable) Consistent unit tests IdiomaticLANGUAGEBINDINGS
  • 8. SPDK, PMDK & Vtune™ Summit 8 pmemkvsampleprogram -- JAVA public static void main(String[] args) { KVEngine kv = new KVEngine("vsmap", "{"path":"/dev/shm/"}"); kv.put("key1", "value1"); assert kv.count() == 1; assert kv.get("key1").equals("value1"); kv.all((String k) -> System.out.println(" visited: " + k)); kv.remove("key1"); assert !kv.exists("key1"); kv.stop(); } NOTE: Binding based on JNI Throw exception on error Supports String, byte[] and ByteBuffer Overloaded iterator methods/types
  • 9. SPDK, PMDK & Vtune™ Summit 9 pmemkvsampleprogram -- nodejs const kv = new KVEngine('vsmap', '{"path":"/dev/shm/"}'); kv.put('key1', 'value1'); assert(kv.count === 1); assert(kv.get('key1') === 'value1'); kv.all((k) => console.log(` visited: ${k}`)); kv.remove('key1'); assert(!kv.exists('key1')); kv.stop(); NOTE: Maintained by Intel JSTC Binding based on NAPI Throw exception on error Buffer support coming soon!
  • 10. SPDK, PMDK & Vtune™ Summit 10 pmemkvsampleprogram -- RUBY kv = KVEngine.new('vsmap', '{"path":"/dev/shm/"}') kv.put('key1', 'value1') assert kv.count == 1 assert kv.get('key1').eql?('value1') kv.all_strings {|k| puts " visited: #{k}"} kv.remove('key1') assert !kv.exists('key1') kv.stop NOTE: Binding based on FFI Throw exception on error Supports string & byte array Iterator methods with type names
  • 11. SPDK, PMDK & Vtune™ Summit 11 sourcesoflatencyWithinHIGH-LEVELBINDINGS • # of round trips between high-level language & native code • pmemkv language bindings (one round trip per operation) • Copy key/value data between persistent memory and high-level object • Create high-level object (string, byte[], reference type, callback/closure) • Depending on the type of high-level object… • Translate bytes to UTF-8 • String interning, reference counting or GC • pmemkv core (native code) • Searching indexes in DRAM • Updating indexes in DRAM • Managing transactions • Allocating persistent memory • Persistent Memory (read & write latencies)
  • 12. SPDK, PMDK & Vtune™ Summit 12 relativeperformanceofBINDINGS NOTE: Single-threaded benchmarks on emulated persistent memory, 16 byte keys & values, C++ all/each pass pointers only, C++ & Java benchmarks use pre-generated keys, Ruby & NodeJS bindings use UTF-8 strings built during the benchmark
  • 13. SPDK, PMDK & Vtune™ Summit 13 relativeperformanceofBINDINGS NOTE: Single-threaded benchmarks on emulated persistent memory, 16 byte keys & values, C++ all/each pass pointers only, C++ & Java benchmarks use pre-generated keys, Ruby & NodeJS bindings use UTF-8 strings built during the benchmark
  • 14. SPDK, PMDK & Vtune™ Summit 14 Implementations: cmap (PMDK concurrent map) vsmap (memkind) vcmap (memkind) tree3 / stree (experimental) caching (experimental) Goals: Applications can use multiple engines Engines are optimized for different workloads & capabilities (threading, persistence, iterating, sorting) All engines work with all utilities and language bindings Engines can use other engines Engines from the community storageengines
  • 15. SPDK, PMDK & Vtune™ Summit 15 AVAILABLEENGINES
  • 16. SPDK, PMDK & Vtune™ Summit 16 contributingENGINESiseasy https://github.com/pmem/pmemkv/blob/master/CONTRIBUTING.md#engines
  • 17. SPDK, PMDK & Vtune™ Summit 17 1.0 Release: C/C++, Java, JavaScript, Ruby bindings cmap, vmap, vcmap engines Automated tests & CI environment pmemkv_bench (port of db_bench) Q2 2019 (estimated) 1.1 Release: Python bindings csmap, caching engines Third-party engines? Pool partitioning Q4 2019 (estimated) pmemkvroadmap
  • 18. SPDK, PMDK & Vtune™ Summit 18 calltoaction Star/watch us on GitHub! https://github.com/pmem/pmemkv