系统优化

飞牛NAS SSD缓存方案:LVM-Cache vs bcache

在飞牛NAS(fnOS)的日常使用中,机械硬盘的随机读写性能往往是整机体验的瓶颈。尤其是当你部署了Docker容器、运行数据库或频繁访问小文件时,那种“卡顿感”会非常明显。为机械盘添加一块SSD作为缓存,是性价比最高的加速方案。飞牛NAS底层基于Linux,因此我们可以在系统层面直接使用LVM-Cache或bcache两种主流方案。

本文将手把手带你在这两种方案中做出选择,并给出具体的配置命令。请注意,以下操作涉及底层存储结构,务必提前备份重要数据。

为什么不用飞牛自带的“存储空间加速”?

飞牛NAS图形界面内置了SSD缓存加速功能,但其底层实现是基于文件级的缓存,且只能对整个存储池(Volume)启用。对于需要精细化控制读写策略、或者想在单个逻辑卷(LVM)级别进行缓存的高级用户来说,Linux原生的LVM-Cache和bcache更加灵活、性能上限更高。

方案一:LVM-Cache —— 适合“小容量、高命中率”场景

LVM-Cache是Linux内核原生支持的特性,它基于Device Mapper框架。其核心逻辑是将一个高速SSD设备(Cache PV)和一个低速HDD设备(Data PV)组合成一个新的逻辑卷(LV)。它的最大优势是配置简单、与LVM生态无缝集成,且支持写回(writeback)和写透(writethrough)两种策略。

1. 确认当前LVM结构

首先,查看你现有的飞牛系统LVM布局。

sudo pvs
sudo vgs
sudo lvs

假设你的机械盘组成了一个名为fn_data的卷组,上面有一个名为data的逻辑卷。

2. 准备SSD高速设备

将一块SSD(例如/dev/sdb)格式化为LVM物理卷,并加入同一个卷组。

sudo pvcreate /dev/sdb
sudo vgextend fn_data /dev/sdb

3. 创建缓存池

LVM-Cache需要一个“缓存池”LV,它由两个专用LV组成:数据块(Data)和元数据(Metadata)。我们通常用SSD的全部空间作为Data,再从中划分一小部分(约1/1000)作为Metadata。

# 假设sdb总大小100GB,我们分配99GB作为数据块,1GB作为元数据
sudo lvcreate -L 99G -n cache_pool_data fn_data /dev/sdb
sudo lvcreate -L 1G -n cache_pool_meta fn_data /dev/sdb
sudo lvconvert --type cache-pool --poolmetadata fn_data/cache_pool_meta fn_data/cache_pool_data

4. 将缓存池附加到目标LV

将刚才创建的缓存池,附加到我们想要加速的data逻辑卷上。

sudo lvconvert --type cache --cachepool fn_data/cache_pool_data fn_data/data

5. 查看状态与调整策略

使用lvs -a可以看到缓存状态。默认是写透(writethrough)策略,数据安全但性能提升有限。如果你追求极致性能且UPS保障充足,可以改为写回(writeback)。

sudo lvchange --cachemode writeback fn_data/data

优点:管理统一,使用lvresize即可扩容。缺点:缓存粒度是4KB块,对顺序读优化不如bcache。

方案二:bcache —— 适合“大容量、高并发”场景

bcache是另一款内核级缓存方案,它被设计为通用块层缓存。与LVM-Cache不同,bcache将SSD和HDD作为两个独立的块设备注册,然后通过make-bcache命令创建缓存集(Cache Set)和后备设备(Backing Device)。它的最大优势是支持多块HDD共享一块SSD,并且拥有更智能的替换算法。

1. 格式化缓存盘与数据盘

首先,擦除设备上的文件系统标识,然后注册为bcache设备。

# 假设SSD为 /dev/sdc,HDD为 /dev/sdd
sudo make-bcache -B /dev/sdd
sudo make-bcache -C /dev/sdc

2. 注册设备

刚创建的设备需要手动注册才能被系统识别。

sudo bcache-super-show /dev/sdc
sudo echo /dev/sdc > /sys/fs/bcache/register
sudo echo /dev/sdd > /sys/fs/bcache/register

3. 绑定缓存与后端设备

查看缓存集的UUID,然后将其绑定到后端设备(HDD)上。

# 查看缓存集UUID(假设为 xxxx-xxxx-xxxx)
ls /sys/fs/bcache/
# 绑定缓存集
echo xxxx-xxxx-xxxx > /sys/block/bcache0/bcache/attach

4. 设置运行模式

bcache支持三种模式:writethrough(默认)、writeback(回写)和writearound(绕写)。

# 查看和设置模式
cat /sys/block/bcache0/bcache/cache_mode
echo writeback > /sys/block/bcache0/bcache/cache_mode

5. 创建文件系统并挂载

此时/dev/bcache0就是一个融合后的块设备,你可以直接对它分区、格式化。

sudo mkfs.ext4 /dev/bcache0
sudo mount /dev/bcache0 /mnt/cache_test

优点:支持顺序写加速、可多个HDD共用一块SSD。缺点:配置相对复杂,且如果SSD损坏,数据可能丢失(尤其在writeback模式下)。

实战建议:如何选择?

经过上述对比,我的建议如下。

如果你只求稳妥、且只有一个存储池,优先选择LVM-Cache。因为飞牛NAS的LVM体系已经很完善,LVM-Cache可以直接集成到现有卷组中,回滚和故障排查容易。

如果你有多个机械硬盘需要同时加速,或者你希望SSD缓存可以被多个独立目录或服务共享,那么bcache更合适。它在多任务并发下的缓存命中率更高。

重要警告:无论选择哪种方案,writeback模式都存在数据丢失风险(意外断电时)。如果追求数据绝对安全,请使用writethrough(写透)。在配置完成后,建议用fio工具进行简单读写测试,看缓存是否生效。

总结

飞牛NAS的SSD缓存方案并非只有图形界面一种。通过LVM-Cache或bcache,你可以获得更底层的控制权。LVM-Cache胜在简单集成,bcache胜在灵活高效。对于大多数家庭用户,我更推荐LVM-Cache,它足以应对日常的Docker和影音库加速需求。动手前务必做好数据备份,祝你折腾愉快。

💬 评论区
发表评论

暂无评论,来说两句吧