可以在linux中用lvm cache将nvme盘作为缓存层加速hdd,通过dm-cache模块接管i/o路径;需先分区、建pv/vg/lv,再创建cache_pool并绑定origin lv,支持writethrough/writeback模式,最后格式化挂载并用fio验证性能提升。

可以在Linux中用LVM Cache把NVMe盘作为缓存层,加速机械硬盘(或HDD阵列)的I/O性能。核心是用高速NVMe设备缓存慢速HDD上的热点数据,读写路径由内核dm-cache模块接管,无需修改上层应用。
准备物理设备与分区
确保NVMe盘和机械盘都已识别,建议对两者分别创建独立分区(不直接使用整盘),避免LVM元数据与用户数据混杂:
- 用parted或fdisk在HDD上建一个主分区(如/dev/sdb1),作为后端存储
- 在NVMe盘上也建一个分区(如/dev/nvme0n1p1),专用于缓存;大小建议为HDD逻辑卷的5%–10%,但meta卷必须至少占cache卷的1%(例如cache 60G,则meta ≥600MB)
- 确认分区表类型为GPT(尤其NVMe盘),并用partprobe刷新内核分区信息
构建LVM结构并配置缓存池
按标准LVM三层结构搭建:PV → VG → LV,再分出cache和meta逻辑卷:
- 执行pvcreate /dev/sdb1 /dev/nvme0n1p1初始化物理卷
- 创建卷组:vgcreate vg_data /dev/sdb1 /dev/nvme0n1p1
- 创建后端LV(origin):lvcreate -n lv_hdd -L 95G vg_data /dev/sdb1(指定在HDD上)
- 创建缓存数据LV:lvcreate -n cache_block -L 60G vg_data /dev/nvme0n1p1
- 创建缓存元数据LV:lvcreate -n cache_meta -L 1G vg_data /dev/nvme0n1p1(注意顺序:先meta后block,且lvconvert命令中--poolmetadata必须写meta卷名,--cachepool写block卷名)
- 组合为缓存池:lvconvert --type cache-pool --poolmetadata vg_data/cache_meta vg_data/cache_block
绑定缓存到目标逻辑卷
将已建好的缓存池关联到HDD逻辑卷,启用加速:
- 执行lvconvert --type cache --cachepool vg_data/cache_block vg_data/lv_hdd
- 缓存模式可选:writethrough(安全,默认,写入同步落盘)、writeback(性能高,需UPS保障断电不丢数据)
- 如需切换模式:lvchange --cachemode writeback vg_data/lv_hdd
- 验证是否生效:lvs -o +cache_used_blocks,cache_total_blocks,cache_read_hits,cache_write_hits;或看lsblk输出中lv_hdd是否显示cache类型
格式化、挂载与性能验证
缓存启用后,LV表现仍为普通块设备,按常规流程使用:
- 格式化:mkfs.xfs /dev/vg_data/lv_hdd(推荐XFS,对大块IO友好)
- 挂载:mount /dev/vg_data/lv_hdd /mnt/hdd,加入/etc/fstab实现开机自动挂载
- 用fio测试真实性能:fio fio-hdd.conf --filename=/mnt/hdd/fio_test,重点关注RAND4K Q32T16随机读IOPS提升(典型提升可达数十倍)
- 若需临时关闭缓存调试:lvconvert --uncache vg_data/lv_hdd











