| .TH "LVMCACHE" "7" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" |
| .SH NAME |
| lvmcache \(em LVM caching |
| |
| .SH DESCRIPTION |
| |
| The \fBcache\fP logical volume type uses a small and fast LV to improve |
| the performance of a large and slow LV. It does this by storing the |
| frequently used blocks on the faster LV. |
| LVM refers to the small fast LV as a \fBcache pool LV\fP. The large |
| slow LV is called the \fBorigin LV\fP. Due to requirements from dm-cache |
| (the kernel driver), LVM further splits the cache pool LV into two |
| devices - the \fBcache data LV\fP and \fBcache metadata LV\fP. The cache |
| data LV is where copies of data blocks are kept from the |
| origin LV to increase speed. The cache metadata LV holds the |
| accounting information that specifies where data blocks are stored (e.g. |
| on the origin LV or on the cache data LV). Users should be familiar with |
| these LVs if they wish to create the best and most robust cached |
| logical volumes. All of these associated LVs must be in the same VG. |
| |
| .SH Cache Terms |
| .nf |
| origin LV OriginLV large slow LV |
| cache data LV CacheDataLV small fast LV for cache pool data |
| cache metadata LV CacheMetaLV small fast LV for cache pool metadata |
| cache pool LV CachePoolLV CacheDataLV + CacheMetaLV |
| cache LV CacheLV OriginLV + CachePoolLV |
| .fi |
| |
| .SH Cache Usage |
| |
| The primary method for using a cache type logical volume: |
| |
| |
| .SS 0. create OriginLV |
| |
| Create an LV or identify an existing LV to be the origin LV. |
| |
| .B lvcreate \-n OriginLV \-L LargeSize VG SlowPVs |
| |
| .I Example |
| .br |
| # lvcreate \-n lvol0 \-L 100G vg |
| |
| |
| .SS 1. create CacheDataLV |
| |
| Create the cache data LV. This LV will hold data blocks from the |
| OriginLV. The size of this LV is the size of the cache and will be |
| reported as the size of the cache pool LV. |
| |
| .B lvcreate \-n CacheDataLV \-L CacheSize VG FastPVs |
| |
| .I Example |
| .br |
| # lvcreate \-n cache0 \-L 10G vg /dev/fast |
| |
| |
| .SS 2. create CacheMetaLV |
| |
| Create the cache metadata LV. This LV will hold cache pool metadata. The |
| size of this LV should be 1000 times smaller than the cache data LV, with |
| a minimum size of 8MiB. |
| |
| .B lvcreate \-n CacheMetaLV \-L MetaSize VG FastPVs |
| |
| .I Example |
| .br |
| # lvcreate \-n cache0meta \-L 12M vg /dev/fast |
| |
| .nf |
| # lvs -a vg |
| LV VG Attr LSize Pool Origin |
| cache0 vg -wi-a----- 10.00g |
| cache0meta vg -wi-a----- 12.00m |
| lvol0 vg -wi-a----- 100.00g |
| .fi |
| |
| |
| .SS 3. create CachePoolLV |
| |
| Combine the data and metadata LVs into a cache pool LV. |
| The behavior of the cache pool LV can be set in this step. |
| .br |
| CachePoolLV takes the name of CacheDataLV. |
| .br |
| CacheDataLV is renamed CachePoolLV_cdata and becomes hidden. |
| .br |
| CacheMetaLV is renamed CachePoolLV_cmeta and becomes hidden. |
| |
| .B lvconvert \-\-type cache-pool \-\-poolmetadata VG/CacheMetaLV |
| .RS |
| .B VG/CacheDataLV |
| .RE |
| |
| .I Example |
| .br |
| # lvconvert \-\-type cache\-pool \-\-poolmetadata vg/cache0meta vg/cache0 |
| |
| .nf |
| # lvs -a vg |
| LV VG Attr LSize Pool Origin |
| cache0 vg Cwi---C--- 10.00g |
| [cache0_cdata] vg Cwi------- 10.00g |
| [cache0_cmeta] vg ewi------- 12.00m |
| lvol0 vg -wi-a----- 100.00g |
| .fi |
| |
| |
| .SS 4. create CacheLV |
| |
| Create a cache LV by linking the cache pool LV to the origin LV. |
| The user accessible cache LV takes the name of the origin LV, |
| while the origin LV becomes a hidden LV with the name |
| OriginLV_corig. This can be done while the origin LV is in use. |
| .br |
| CacheLV takes the name of OriginLV. |
| .br |
| OriginLV is renamed OriginLV_corig and becomes hidden. |
| |
| .B lvconvert \-\-type cache \-\-cachepool VG/CachePoolLV VG/OriginLV |
| |
| .I Example |
| .br |
| # lvconvert \-\-type cache \-\-cachepool vg/cache0 vg/lvol0 |
| |
| .nf |
| # lvs -a vg |
| LV VG Attr LSize Pool Origin |
| cache0 vg Cwi---C--- 10.00g |
| [cache0_cdata] vg Cwi-ao---- 10.00g |
| [cache0_cmeta] vg ewi-ao---- 12.00m |
| lvol0 vg Cwi-a-C--- 100.00g cache0 [lvol0_corig] |
| [lvol0_corig] vg -wi-ao---- 100.00g |
| .fi |
| |
| |
| .SH Cache Removal |
| |
| .SS Split a cache pool LV off of a cache LV |
| |
| \& |
| |
| A cache pool LV can be disconnected from a cache LV, leaving an |
| unused cache pool LV, and an uncached origin LV. This command |
| writes back data from the cache pool to the origin LV when necessary. |
| |
| .B lvconvert --splitcache VG/CacheLV |
| |
| .SS Removing a cache pool LV without removing its linked origin LV |
| |
| \& |
| |
| This writes back data from the cache pool to the origin LV when necessary, |
| then removes the cache pool LV, leaving the uncached origin LV. |
| |
| .B lvremove VG/CachePoolLV |
| |
| An alternative command that also disconnects the cache pool from the cache |
| LV, and deletes the cache pool: |
| |
| .B lvconvert --uncache VG/CacheLV |
| |
| .I Example |
| .nf |
| # lvs vg |
| LV VG Attr LSize Pool Origin |
| cache0 vg Cwi---C--- 10.00g |
| lvol0 vg Cwi-a-C--- 100.00g cache0 [lvol0_corig] |
| |
| # lvremove vg/cache0 |
| |
| # lvs vg |
| LV VG Attr LSize Pool Origin |
| lvol0 vg -wi-a----- 100.00g |
| .fi |
| |
| .SS Removing a cache LV: both origin LV and the cache pool LV |
| |
| \& |
| |
| Removing a cache LV removes both the origin LV and the linked cache pool |
| LV. |
| |
| .B lvremove VG/CacheLV |
| |
| |
| .SH Cache Topics |
| |
| .SS Tolerate device failures in a cache pool LV |
| |
| \& |
| |
| Users who are concerned about the possibility of failures in their fast |
| devices that could lead to data loss might consider making their cache |
| pool sub-LVs redundant. |
| |
| .I Example |
| .nf |
| 0. Create an origin LV we wish to cache |
| # lvcreate \-L 10G \-n lv1 vg /dev/slow_devs |
| |
| 1. Create a 2-way RAID1 cache data LV |
| # lvcreate \-\-type raid1 \-m 1 \-L 1G -n cache1 vg \\ |
| /dev/fast1 /dev/fast2 |
| |
| 2. Create a 2-way RAID1 cache metadata LV |
| # lvcreate \-\-type raid1 \-m 1 \-L 8M -n cache1meta vg \\ |
| /dev/fast1 /dev/fast2 |
| |
| 3. Create a cache pool LV combining cache data LV and cache metadata LV |
| # lvconvert \-\-type cache\-pool \-\-poolmetadata vg/cache1meta vg/cache1 |
| |
| 4. Create a cached LV by combining the cache pool LV and origin LV |
| # lvconvert \-\-type cache \-\-cachepool vg/cache1 vg/lv1 |
| .fi |
| |
| .SS Cache mode |
| |
| \& |
| |
| The default cache mode is "writethrough". Writethrough ensures that any |
| data written will be stored both in the cache pool LV and on the origin |
| LV. The loss of a device associated with the cache pool LV in this case |
| would not mean the loss of any data. |
| |
| A second cache mode is "writeback". Writeback delays writing data blocks |
| from the cache pool back to the origin LV. This mode will increase |
| performance, but the loss of a device associated with the cache pool LV |
| can result in lost data. |
| |
| With the \-\-cachemode option, the cache mode can be set when creating a |
| cache LV, or changed on an existing cache LV. The current cache mode of a |
| cache LV can be displayed with the cache_mode reporting option: |
| |
| .B lvs \-o+cache_mode VG/CacheLV |
| |
| .BR lvm.conf (5) |
| .B allocation/cache_mode |
| .br |
| defines the default cache mode. |
| |
| .I Example |
| .nf |
| 0. Create an origin LV we wish to cache (yours may already exist) |
| # lvcreate \-L 10G \-n lv1 vg /dev/slow |
| |
| 1. Create a cache data LV |
| # lvcreate \-L 1G \-n cache1 vg /dev/fast |
| |
| 2. Create a cache metadata LV |
| # lvcreate \-L 8M \-n cache1meta vg /dev/fast |
| |
| 3. Create a cache pool LV |
| # lvconvert \-\-type cache\-pool \-\-poolmetadata vg/cache1meta vg/cache1 |
| |
| 4. Create a cache LV by combining the cache pool LV and origin LV, |
| and use the writethrough cache mode. |
| # lvconvert \-\-type cache \-\-cachepool vg/cache1 \\ |
| \-\-cachemode writethrough vg/lv1 |
| .fi |
| |
| |
| .SS Cache policy |
| |
| \& |
| |
| The cache subsystem has additional per-LV parameters: the cache policy to |
| use, and possibly tunable parameters for the cache policy. Three policies |
| are currently available: "smq" is the default policy, "mq" is an older |
| implementation, and "cleaner" is used to force the cache to write back |
| (flush) all cached writes to the origin LV. |
| |
| The "mq" policy has a number of tunable parameters. The defaults are |
| chosen to be suitable for the majority of systems, but in special |
| circumstances, changing the settings can improve performance. |
| |
| With the \-\-cachepolicy and \-\-cachesettings options, the cache policy |
| and settings can be set when creating a cache LV, or changed on an |
| existing cache LV (both options can be used together). The current cache |
| policy and settings of a cache LV can be displayed with the cache_policy |
| and cache_settings reporting options: |
| |
| .B lvs \-o+cache_policy,cache_settings VG/CacheLV |
| |
| .I Example |
| .nf |
| Change the cache policy and settings of an existing cache LV. |
| # lvchange \-\-cachepolicy mq \-\-cachesettings \\ |
| \(aqmigration_threshold=2048 random_threshold=4\(aq vg/lv1 |
| .fi |
| |
| .BR lvm.conf (5) |
| .B allocation/cache_policy |
| .br |
| defines the default cache policy. |
| |
| .BR lvm.conf (5) |
| .B allocation/cache_settings |
| .br |
| defines the default cache settings. |
| |
| |
| .SS Chunk size |
| |
| \& |
| |
| The size of data blocks managed by a cache pool can be specified with the |
| \-\-chunksize option when the cache LV is created. The default unit |
| is KiB. The value must be a multiple of 32KiB between 32KiB and 1GiB. |
| |
| Using a chunk size that is too large can result in wasteful use of the |
| cache, where small reads and writes can cause large sections of an LV to |
| be mapped into the cache. However, choosing a chunk size that is too |
| small can result in more overhead trying to manage the numerous chunks |
| that become mapped into the cache. Overhead can include both excessive |
| CPU time searching for chunks, and excessive memory tracking chunks. |
| |
| Command to display the cache pool LV chunk size: |
| .br |
| .B lvs \-o+chunksize VG/CacheLV |
| |
| .BR lvm.conf (5) |
| .B cache_pool_chunk_size |
| .br |
| controls the default chunk size used when creating a cache LV. |
| |
| The default value is shown by: |
| .br |
| .B lvmconfig \-\-type default allocation/cache_pool_chunk_size |
| |
| |
| .SS Spare metadata LV |
| |
| \& |
| |
| See |
| .BR lvmthin (7) |
| for a description of the "pool metadata spare" LV. |
| The same concept is used for cache pools. |
| |
| .SS Automatic pool metadata LV |
| |
| \& |
| |
| A cache data LV can be converted to cache pool LV without specifying a |
| cache pool metadata LV. LVM will automatically create a metadata LV from |
| the same VG. |
| |
| .B lvcreate -n CacheDataLV -L CacheSize VG |
| .br |
| .B lvconvert --type cache\-pool VG/CacheDataLV |
| |
| |
| .SS Create a new cache LV without an existing origin LV |
| |
| \& |
| |
| A cache LV can be created using an existing cache pool without an existing |
| origin LV. A new origin LV is created and linked to the cache pool in a |
| single step. |
| |
| .B lvcreate \-\-type cache \-L LargeSize \-n CacheLV |
| .RS |
| .B \-\-cachepool VG/CachePoolLV VG SlowPVs |
| .RE |
| |
| |
| .SS Single step cache pool LV creation |
| |
| \& |
| |
| A cache pool LV can be created with a single lvcreate command, rather than |
| using lvconvert on existing LVs. This one command creates a cache data |
| LV, a cache metadata LV, and combines the two into a cache pool LV. |
| |
| .B lvcreate \-\-type cache\-pool \-L CacheSize \-n CachePoolLV VG FastPVs |
| |
| |
| .SS Convert existing LVs to cache types |
| |
| \& |
| |
| When an existing origin LV is converted to a cache LV, the specified cache |
| pool may be a normal LV, rather than a cache pool LV. In this case, lvm |
| will first convert the normal LV to a cache pool LV. A pool metadata LV |
| may optionally be specified. |
| |
| .B lvcreate -n OriginLV -L LargeSize VG |
| .br |
| .B lvcreate -n CacheDataLV -L CacheSize VG |
| .br |
| .B lvconvert --type cache --cachepool VG/CataDataLV VG/OriginLV |
| |
| This is equivalent to: |
| |
| .B lvcreate -n OriginLV -L LargeSize VG |
| .br |
| .B lvcreate -n CacheDataLV -L CacheSize VG |
| .br |
| .B lvconvert --type cache-pool VG/CacheDataLV |
| .br |
| .B lvconvert --type cache --cachepool VG/CachePoolLV VG/OriginLV |
| |
| |
| .SH SEE ALSO |
| .BR lvm.conf (5), |
| .BR lvchange (8), |
| .BR lvcreate (8), |
| .BR lvdisplay (8), |
| .BR lvextend (8), |
| .BR lvremove (8), |
| .BR lvrename (8), |
| .BR lvresize (8), |
| .BR lvs (8), |
| .BR vgchange (8), |
| .BR vgmerge (8), |
| .BR vgreduce (8), |
| .BR vgsplit (8) |