LVM Cache通过NVMe盘缓存HDD阵列,由dm-cache接管读写路径,无需改应用;关键在合理配置缓存大小(5%–10%)、元数据比例(≥0.1%)和模式(writethrough/writeback),分区、PV→VG→LV分层、lvconvert绑定顺序必须严格。

用LVM Cache把NVMe盘当缓存加速HDD阵列,核心是让热点数据自动驻留在高速设备上,读写路径由内核dm-cache模块接管,不改应用、不换存储架构,就能显著提升IOPS和响应速度。关键不在“堆性能”,而在“配得准”——缓存大小、元数据比例、模式选择,每一步都影响稳定性和收益比。
分区与设备准备:先分清角色,再动手操作
NVMe盘和机械盘都要单独分区,别直接用整盘,避免LVM元数据混入用户数据区:
- 对每块HDD(如
/dev/sdb、/dev/sdc)用parted建一个主分区,例如/dev/sdb1、/dev/sdc1,建议GPT分区表 - 对NVMe盘(如
/dev/nvme0n1)同样分区,例如/dev/nvme0n1p1;注意大小要留足:缓存数据卷+元数据卷之和,至少为HDD总逻辑卷容量的5%–10% - 执行
partprobe刷新内核分区信息,确认lsblk能正确识别所有新分区
LVM结构搭建:三层分离,顺序不能错
缓存依赖严格的数据分层,PV→VG→LV必须按逻辑拆开,尤其cache_meta和cache_block必须同属一块NVMe物理卷:
- 初始化物理卷:
pvcreate /dev/sdb1 /dev/sdc1 /dev/nvme0n1p1 - 创建卷组(建议命名带含义,如
vg_hdd_cache):vgcreate vg_hdd_cache /dev/sdb1 /dev/sdc1 /dev/nvme0n1p1 - 创建后端LV(指定在HDD上):
lvcreate -n lv_data -L 2.5T vg_hdd_cache /dev/sdb1 /dev/sdc1 - 创建缓存元数据LV(必须先建,且大小≥cache卷的0.1%):
lvcreate -n cache_meta -L 2G vg_hdd_cache /dev/nvme0n1p1 - 创建缓存数据LV:
lvcreate -n cache_block -L 200G vg_hdd_cache /dev/nvme0n1p1
启用缓存池与绑定:两步命令定成败
这两条lvconvert命令顺序和参数不能颠倒,否则会报错或缓存不生效:
- 先组合缓存池:
lvconvert --type cache-pool --poolmetadata vg_hdd_cache/cache_meta vg_hdd_cache/cache_block - 再绑定到目标LV:
lvconvert --type cache --cachepool vg_hdd_cache/cache_block vg_hdd_cache/lv_data - 默认是
writethrough模式(安全),若追求写入性能且有UPS保障,可切writeback:lvchange --cachemode writeback vg_hdd_cache/lv_data - 验证是否成功:
lvs -o +cache_used_blocks,cache_read_hits,cache_write_hits或看lsblk输出中lv_data是否显示cache类型
格式化、挂载与持续观察
缓存启用后,LV仍表现为普通块设备,但背后IO已分流处理:
- 推荐XFS文件系统:
mkfs.xfs -f /dev/vg_hdd_cache/lv_data(对大块IO和元数据操作更友好) - 挂载并加入
/etc/fstab:/dev/vg_hdd_cache/lv_data /mnt/data xfs defaults 0 0 - 用
fio做基础验证:例如fio --name=randread --ioengine=libaio --rw=randread --bs=4k --direct=1 --runtime=60 --time_based --group_reporting,对比启用前后随机读IOPS变化 - 长期运行中关注
cache_read_hits比率,若长期低于60%,说明缓存空间不足或热点不集中,需调大缓存或检查访问模式


















