Developer(s) | Joe Thornber, Heinz Mauelshagen, Mike Snitzer and others |
---|---|
Initial release | April 28, 2013; 11 years ago (2013-04-28) (Linux 3.9) |
Written in | C |
Operating system | Linux |
Type | Linux kernel feature |
License | GNU GPL |
Website | kernel |
dm-cache is a component (more specifically, a target) of theLinux kernel'sdevice mapper, which is aframework for mappingblock devices onto higher-level virtual block devices. It allows one or more fast storage devices, such as flash-basedsolid-state drives (SSDs), to act as acache for one or more slower storage devices such ashard disk drives (HDDs); this effectively createshybrid volumes and providessecondary storage performance improvements.
The design of dm-cache requires three physical storage devices for the creation of a single hybrid volume; dm-cache uses those storage devices to separately store actual data, cache data, and requiredmetadata. Configurable operating modes and cache policies, with the latter in the form of separate modules, determine the way data caching is actually performed.
dm-cache is licensed under the terms ofGNU General Public License (GPL), with Joe Thornber, Heinz Mauelshagen and Mike Snitzer as its primary developers.
dm-cache uses solid-state drives (SSDs) as an additional level of indirection while accessing hard disk drives (HDDs), improving the overall performance by using fastflash-based SSDs as caches for the slower mechanical HDDs based on rotationalmagnetic media. As a result, the costly speed of SSDs becomes combined with the storage capacity offered by slower but less expensive HDDs.[1] Moreover, in the case ofstorage area networks (SANs) used incloud environments as shared storage systems forvirtual machines, dm-cache can also improve overall performance and reduce the load of SANs by providing data caching using client-side local storage.[2][3][4]
dm-cache is implemented as a component of the Linux kernel'sdevice mapper, which is avolume management framework that allows various mappings to be created between physical and virtual block devices. The way a mapping between devices is created determines how the virtualblocks are translated into underlying physical blocks, with the specific translation types referred to astargets.[5] Acting as a mapping target, dm-cache makes it possible for SSD-based caching to be part of the created virtual block device, while the configurable operating modes and cache policies determine how dm-cache works internally. The operating mode selects the way in which the data is kept in sync between an HDD and an SSD, while the cache policy, selectable from separate modules that implement each of the policies, provides thealgorithm for determining which blocks are promoted (moved from an HDD to an SSD), demoted (moved from an SSD to an HDD), cleaned, etc.[6]
When configured to use themultiqueue (mq) orstochastic multiqueue (smq) cache policy, with the latter being the default, dm-cache uses SSDs to store the data associated with performedrandom reads and writes, capitalizing on near-zeroseek times of SSDs and avoiding suchI/O operations as typical HDD performance bottlenecks. The data associated withsequential reads and writes is not cached on SSDs, avoiding undesirablecache invalidation during such operations; performance-wise, this is beneficial because the sequential I/O operations are suitable for HDDs due to their mechanical nature. Not caching the sequential I/O also helps in extending thelifetime of SSDs used as caches.[7]
Another dm-cache project with similar goals was announced by Eric Van Hensbergen and Ming Zhao in 2006, as the result of an internship work atIBM.[8]
Later, Joe Thornber, Heinz Mauelshagen and Mike Snitzer provided their own implementation of the concept, which resulted in the inclusion of dm-cache into the Linux kernel. dm-cache was merged into theLinux kernel mainline in kernel version 3.9, which was released on April 28, 2013.[6][9]
In dm-cache, creating a mapped virtual block device that acts as ahybrid volume requires three physical storage devices:[6]
Internally, dm-cache references to each of the origin devices through a number of fixed-size blocks; the size of these blocks, equaling to the size of a cachingextent, is configurable only during the creation of a hybrid volume. The size of a caching extent must range between 32 KB and 1 GB, and it must be a multiple of 32 KB; typically, the size of a caching extent is between 256 and 1024 KB. The choice of the caching extents bigger thandisk sectors acts a compromise between the size ofmetadata and the possibility for wasting cache space. Having too small caching extents increases the size of metadata, both on the metadata device and in kernel memory, while having too large caching extents increases the amount of wasted cache space due to caching whole extents even in the case of highhit rates only for some of their parts.[6][10]
Operating modes supported by dm-cache arewrite-back, which is the default,write-through, andpass-through. In the write-back operating mode, writes to cached blocks go only to the cache device, while the blocks on origin device are only marked as dirty in the metadata. For the write-through operating mode, write requests are not returned as completed until the data reaches both the origin and cache devices, with no clean blocks becoming marked as dirty. In the pass-through operating mode, all reads are performed directly from the origin device, avoiding the cache, while all writes go directly to the origin device; any cache write hits also cause invalidation of the cached blocks. The pass-through mode allows a hybrid volume to be activated when the state of a cache device is not known to be consistent with the origin device.[6][11]
The rate of data migration that dm-cache performs in both directions (i.e., data promotions and demotions) can bethrottled down to a configured speed so regular I/O to the origin and cache devices can be preserved. Decommissioning a hybrid volume or shrinking a cache device requires use of thecleaner policy, which effectively flushes all blocks marked in metadata as dirty from the cache device to the origin device.[6][7]
As of August 2015[update] and version 4.2 of the Linux kernel,[12] the following three cache policies are distributed with the Linux kernel mainline, out of which dm-cache by default uses thestochastic multiqueue policy:[6][7]
Logical Volume Manager includeslvmcache
, which provides a wrapper fordm-cache
integrated with LVM.[13]
A read and write hot-spot cache, using the dm-cache kernel module.