FDP configuration consists of one or more RUs organized into one or more RGs with one or more Reclaim Unit Handles (RUHs). Each RUH references a RU within an RG.
An overview of how FDP works and its potential TCO impact for hyperscalers including links to additional resources can be found in a previous Tech Blog article entitled Hyperscalers Embrace Flexible Data Placement (FDP) to Increase Performance and Lower TCO
, by Samsung’s Senior Director of Product Planning, Mike Allison.
Currently, there’s nothing on the horizon with the potential to become a mainstream industry solution to data placement as promising as FDP. Support for FDP is already available in operating systems, libraries and tools, and applications, so hyperscalers and datacenters can expect to adopt FDP-enabled SSDs with relative ease when they become available. Let’s look at the current state of support for FDP within the storage stack:
Linux Kernel I/O
In Linux 6.2 operating systems, FDP is implemented using I/O Passthru without requiring any changes to the kernel. Linux 6.2 offers an asynchronous path to the NVMe generic character device that allows user-space applications to directly access the Kernel NVMe driver, bypassing the block layer. This means that applications can leverage an end-to-end architecture similar to SPDK, but using the in-kernel NVMe driver instead. Earlier versions of Linux (5.17-6.1) also support FDP using I/O Passthru, supported by io_uring.
In Linux OSes, the kernel I/O subsystem handles caching, scheduling, spooling, device reservation, error handling, and provides device independence, resource management, and concurrency management to the I/O devices.
Libraries & Tools
provide full support for FDP. xNVMe enables FDP in different storage paths by leveraging the SPDK NVMe driver and the I/O Passthru, io_uring. The ability to connect FDP-enabled SSDs with standard storage interfaces makes adoption easy for application developers and storage infrastructure architects.
xNVMe provides the means to program and interact with NVMe devices from user space. The foundation of xNVMe is libxnvme, a user space library for working with NVMe devices. It provides a C API for memory management, that is, for allocating physical/DMA transferable memory when needed. The Storage Performance Development Kit (SPDK) provides a set of tools and libraries for writing high performance, scalable, user-mode storage applications.
Currently, an industry-wide initiative to add support for FDP in Cachelib4
is underway. Testing has already shown that FDP helps Cachelib to reduce Write Amplification Factor (WAF) by segregating data from its two object pools: BigHash and BlockCache5
, without major optimizations. Based on experimental results that use real hyperscale workloads, a significant reduction in WAF can be achieved while increasing SSD utilization, with no impact on cache hit-rate.