我发现 bcache 更适合我,但由于今天的讨论,我来测试 dm-cache。我没有找到很好的入门文档来介绍如何操作,所以我想我也可以在这里记录和分享 - 并通过这种方式使其“可搜索”。
那么如何在 Ubuntu 上实际设置 dm-cache?
答案1
我开始了解这个信息充分利用你的 NVMe,也是man lvmcache
一个很好的资源。
我(抱歉)没有更多的磁盘:
/dev/sda2 (931G slow)
/dev//dev/nvme0n1 (372.6G fast)
基本设置:
$ sudo pvcreate /dev/sda2
Physical volume "/dev/sda2" successfully created.
$ sudo pvcreate /dev/nvme0n1
Physical volume "/dev/nvme0n1" successfully created.
$ sudo vgcreate cache /dev/sda2 /dev/nvme0n1
Volume group "cache" successfully created
$ sudo lvcreate -L 200G -n origin_device cache /dev/sda2
Logical volume "origin_device" created
$ sudo lvcreate -L 60G -n cache_block cache /dev/nvme0n1
Logical volume "cache_block" created.
$ sudo lvcreate -L 2G -n cache_meta cache /dev/nvme0n1
Logical volume "cache_meta" created.
$ sudo lvconvert --type cache-pool /dev/cache/cache_block --poolmetadata /dev/cache/cache_meta
WARNING: Converting logical volume cache/cache_block and cache/cache_meta to pool's data and metadata volumes.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert cache/cache_block and cache/cache_meta? [y/n]: y
Converted cache/cache_block to cache pool.
$ sudo lvconvert --type cache /dev/cache/origin_device --cachepool /dev/cache/cache_block
Logical volume cache/origin_device is now cached.
之后,您就可以“照常”使用该设备了。我还创建了一个非缓存设备作为基本测试的参考:
$ sudo lvcreate -L 200G -n origin_device_reference cache /dev/sda2
Logical volume "origin_device_reference" created.
$ sudo mkfs -t xfs /dev/cache/origin_device
$ sudo mkfs -t xfs /dev/cache/origin_device_reference
并安装它
$ sudo mkdir /mnt/lv-xfs
$ sudo mkdir /mnt/lv-xfs-cached
$ sudo mount /dev/cache/origin_device_reference /mnt/lv-xfs
$ sudo mount /dev/cache/origin_device /mnt/lv-xfs-cached
此后我的设置如下所示:
$ lsblk (filtered of other disks)
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
|-sda2 8:2 0 931G 0 part
| |-cache-origin_device_reference 252:4 0 200G 0 lvm /mnt/lv-xfs
| `-cache-origin_device_corig 252:3 0 200G 0 lvm
| `-cache-origin_device 252:0 0 200G 0 lvm /mnt/lv-xfs-cached
nvme0n1 259:0 0 372.6G 0 disk
|-cache-cache_block_cdata 252:1 0 60G 0 lvm
| `-cache-origin_device 252:0 0 200G 0 lvm /mnt/lv-xfs-cached
`-cache-cache_block_cmeta 252:2 0 2G 0 lvm
`-cache-origin_device 252:0 0 200G 0 lvm /mnt/lv-xfs-cached
$ sudo dmsetup table
cache-cache_block_cdata: 0 125829120 linear 259:0 2048
cache-origin_device_reference: 0 419430400 linear 8:2 423626752
cache-cache_block_cmeta: 0 4194304 linear 259:0 125831168
cache-origin_device: 0 419430400 cache 252:2 252:1 252:3 128 1 writethrough smq 0
cache-origin_device_corig: 0 419430400 linear 8:2 2048
请注意,dm-cache 已经发生了很大变化。仍有许多指南建议使用“dmsetup message ...”调整缓存,但所有这些都是旧“mq”策略的一部分。请参阅内核文档。如今,随机多队列 (smq) 是默认设置,被认为是更高级的,并且没有任何调整旋钮。自内核 4.6 以来,甚至删除了“mq”,并将其作为 smq 策略的别名。
真是太基本基准测试有两个慢速同步 io 顺序磁盘爬虫和两个 aio 随机热点(并非所有爬虫都能放入缓存,但热点很容易做到)。还有更多细节如果您想查看结果,可以查看结果。结果比没有缓存时好得多,但测试用例不够复杂,无法详细检查。
Uncached
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.10 0.20 259.95 126.45 1840.00 599.32 12.63 65.96 170.43 126.56 260.62 2.59 100.00
dm-4 0.00 0.00 260.05 126.65 1840.00 599.32 12.62 65.99 170.37 126.53 260.39 2.59 100.00
READ: io=1109.4MB, aggrb=1891KB/s
WRITE: io=370212KB, aggrb=616KB/s
Cached
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.85 1.75 395.75 112.00 1679.40 9.01 33.18 83.44 82.97 83.44 2.52 100.00
nvme0n1 755.05 0.00 159339.95 0.25 873790.40 16.00 10.97 25.14 0.16 0.16 0.00 0.01 100.12
dm-0 0.00 0.00 156881.90 395.95 873903.00 1679.40 11.13 58.35 0.37 0.16 84.19 0.01 100.12
dm-1 0.00 0.00 160095.25 0.25 873791.00 16.00 10.92 25.41 0.16 0.16 0.00 0.01 100.10
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-3 0.00 0.00 1.75 396.60 112.00 1679.40 8.99 34.50 86.51 82.97 86.52 2.51 100.00
READ: io=415116MB, aggrb=708356KB/s
WRITE: io=1004.8MB, aggrb=1714KB/s
这不应该成为关于 bcache、dm-cache 等的讨论,正如我在开头所说的,我通常也更喜欢 bcache,但这不是重点。但是另一方面,如果您对 dm-cache 有任何建议,请随时使用评论部分。