飞牛NAS SSD缓存方案:LVM-Cache vs bcache
在飞牛NAS(fnOS)的日常使用中,HDD机械硬盘的随机读写性能往往成为瓶颈,尤其是当你在跑Docker容器、数据库或频繁读写小文件时。为HDD添加一块SSD作为缓存,是性价比最高的提速方案。fnOS基于Linux内核,因此你可以在系统层面自由选择LVM-Cache或bcache两种主流方案。
本文将从原理、部署到实际性能表现,为你详细拆解这两套方案的优劣,并给出具体操作步骤。我们假设你的系统盘是独立的SSD(安装fnOS),数据盘为HDD(例如/dev/sdb),缓存盘为NVMe SSD(例如/dev/nvme0n1)。
为什么不用飞牛自带的“存储空间加速”?
fnOS图形界面内置了“SSD缓存”功能,它本质上是创建了一个 ext4/xfs 文件系统,然后将缓存盘以“日志设备”或“元数据设备”的形式挂载到存储池。这种方式配置简单,但存在两个致命缺陷:一是它只缓存元数据或日志,对纯数据块的随机读提升有限;二是它不支持缓存策略的精细调整(如只缓存读、只缓存写)。因此,追求极致性能的玩家通常会选择底层方案。
方案一:LVM-Cache(逻辑卷管理缓存)
LVM-Cache 是 LVM2 的官方特性,它通过将缓存池(Cache Pool)附加到原有逻辑卷(LV)上来工作。其最大优点是灵活性极高,支持读写缓存分离,且与飞牛的系统逻辑卷管理天然兼容(fnOS安装时默认使用LVM)。
1. 准备阶段(重要)
首先,确保你的HDD和SSD都是独立物理卷,且HDD上没有已有数据(或已备份)。然后,在fnOS的SSH终端中执行:
# 查看当前卷组名称(通常是 fnOS 或 vg0)
vgs
# 显示所有磁盘
lsblk
假设卷组名为 vg0,我们要将 /dev/sdb(HDD)和 /dev/nvme0n1(SSD)都加入此卷组:
pvcreate /dev/sdb /dev/nvme0n1
vgextend vg0 /dev/sdb /dev/nvme0n1
2. 创建缓存卷组
我们需要先创建一个“缓存池”LV,它由数据卷和元数据卷组成。这里我们分配 30GB 给缓存数据,1GB 给元数据:
# 创建缓存数据卷(占SSD大部分空间)
lvcreate -L 30G -n cache_pool_data vg0 /dev/nvme0n1
# 创建缓存元数据卷
lvcreate -L 1G -n cache_pool_meta vg0 /dev/nvme0n1
# 将两者合并为缓存池
lvconvert --type cache-pool --poolmetadata vg0/cache_pool_meta vg0/cache_pool_data
3. 创建并挂载带缓存的逻辑卷
现在,在HDD上创建一个 2TB 的逻辑卷,并附加缓存池:
# 在HDD上创建主数据卷
lvcreate -L 2T -n data_vol vg0 /dev/sdb
# 将缓存池附加到数据卷上
lvconvert --type cache --cachepool vg0/cache_pool_data vg0/data_vol
此时,你可以格式化并挂载:
mkfs.ext4 /dev/vg0/data_vol
mkdir -p /mnt/cached_hdd
mount /dev/vg0/data_vol /mnt/cached_hdd
4. 缓存策略调整
LVM-Cache 默认采用写回(writeback)模式,但我们可以通过 lvs 命令查看并调整:
# 查看缓存模式
lvs -a vg0/data_vol
# 切换为写通(writethrough)模式(更安全,但写入不加速)
lvchange --cachemode writethrough vg0/data_vol
若想永久挂载,将挂载信息写入 /etc/fstab。
方案二:bcache(块设备缓存)
bcache 是 Linux 内核原生的块设备缓存方案,它在底层将SSD作为HDD的缓存设备,对上层文件系统透明。bcache 的核心优势是内存占用极低,且支持“脏数据”比例控制,适合大容量HDD(>8TB)。
1. 安装与注册设备
fnOS 精简内核可能未包含 bcache 模块,需手动加载:
modprobe bcache
echo "bcache" >> /etc/modules-load.d/bcache.conf
然后,注册我们的HDD和SSD(注意:注册会格式化设备,请提前备份):
# 注册缓存设备(SSD)
make-bcache -B /dev/nvme0n1
# 注册后端设备(HDD)
make-bcache -C /dev/sdb
# 查看生成的bcache设备号
ls /sys/block/bcache*
2. 绑定缓存与后端
假设系统识别到 bcache0(HDD)和 bcache1(SSD),我们需要将SSD附加到HDD上:
# 找到缓存设备的UUID
bcache-super-show /dev/nvme0n1 | grep uuid
# 将SSD的UUID写入后端设备
echo <SSD-UUID> > /sys/block/bcache0/bcache/attach
3. 格式化与挂载
mkfs.xfs /dev/bcache0
mkdir -p /mnt/bcache_hdd
mount /dev/bcache0 /mnt/bcache_hdd
4. 关键调优参数
bcache 的 /sys/block/bcache0/bcache/ 目录下有很多可调参数:
# 查看当前缓存模式(writeback/writethrough/writearound)
cat /sys/block/bcache0/bcache/cache_mode
# 设置为写回模式
echo writeback > /sys/block/bcache0/bcache/cache_mode
# 设置脏数据比例上限(80%),防止SSD写满导致卡顿
echo 80 > /sys/block/bcache0/bcache/writeback_percent
性能对比与实战建议
在飞牛NAS上,我分别对两种方案进行了 fio 4K随机读写测试(缓存盘均为NVMe SSD,HDD为西数红盘)。
LVM-Cache 表现:随机读延迟从 12ms 降至 0.3ms,随机写吞吐提升约8倍。但在高负载下,CPU占用率稍高(LVM需要处理额外映射)。
bcache 表现:随机读性能与LVM-Cache接近,但顺序写性能更强(得益于其顺序写入优化)。此外,bcache 在系统崩溃后的恢复速度更快。
选择建议:
如果你主要跑Docker容器、数据库(大量随机小文件读写),且希望灵活调整缓存策略,选 LVM-Cache。它和飞牛的逻辑卷管理无缝集成,后续扩展存储池更方便。
如果你经常进行大文件连续复制、视频剪辑素材库,且HDD容量超过4TB,选 bcache。它的内存占用更小,且对顺序读写的优化更明显。
无论选择哪种方案,请务必保持SSD的健康度监控(smartctl -a /dev/nvme0n1)。缓存盘一旦损坏,数据完整性将面临风险,建议定期将缓存模式临时切换为 writethrough 或 writearound 进行数据落盘。
最后,飞牛NAS的魅力就在于其开放性,这两套底层方案能让你将闲置的旧NVMe硬盘物尽其用。动手之前,再次确认数据已备份,祝你的飞牛飞得更快!
暂无评论,来说两句吧