家用 NAS 服务器(3)| SSD缓存加速机械硬盘

原文地址:CSDN 博文

前文提要:家用 NAS 服务器(2)| HyperV的Winserver 2022和Ubuntu 22.04双系统

后文链接:家用 NAS 服务器(4)| MergerFS和SnapRaid数据定时备份



1. 前言

呀吼,读者朋友们我们又见面了 o( ̄▽ ̄)ブ。还记得上一章我们已经安装了 Windows Server,并且把 Ubuntu Server 成功在 Hyper-V 中安装。安装成功后,笔者将机械硬盘直通给了 Ubuntu 虚拟机。

但是大家都知道,机械硬盘的随机读写性能非常低,因此为了提高 HDD 的随机读写能力,在这一章中,笔者将带大家,通过设置 bcache 工具,将以 SSD 固态硬盘作为缓存,来提高机械硬盘的随机读写能力

此外,还将简要通过笔者以前的文章,来降低机械硬盘的功耗。笔者的博文在这:SeaChest Utilities 工具,让你的硬盘功耗又低又长寿


2. SSD 缓存加速

SSD 缓存可以有效缓解机械硬盘的随机读写性能低的问题,因此将是服务器投入使用前的第一件需要设置的事情。

在开始演示操作前,笔者先说明一下我的 Ubuntu 的设备结构。如果发现自己的设备结构不同,需要自行调整命令或在 Hyper-V 中修改设备位置。笔者的设备结构如下:

设备名描述
/dev/sda系统盘。实体为外部 Winserver 的虚拟磁盘。
/dev/sdb固态硬盘,将用作 SSD 缓存。
/dev/sdc第一个 16T 机械硬盘。
/dev/sdd第二个 16T 机械硬盘。

2.1 硬盘分区

尽管硬盘不强制分区,笔者还是喜欢给每个存储设备分一个区,此处使用 fdisk 工具创建 GPT 表并进行分区:

# 对机械硬盘进入 fdisk 界面
> sudo fdisk /dev/sdc
# 创建 gpt 分区表
> g
# 创建新分区,全部采用默认设置,即只创建一个分区,占据全部设备空间
> n

读者如果有自己的分区需求,可以自行调整分区结构。此处 SSD 不参与分区。

分区后,笔者目前的分区设备为 /dev/sdc1/dev/sdd1

2.2 bcache

2.2.1 bcache 安装

bcache 是一项 Linux 下的工具,其允许使用固态硬盘作为读写缓存(writeback模式)或者读缓存(writethrough 或者 writearound模式)来为另一个 block 设备(通常是机械硬盘或硬盘阵列)加速。

此外,bcache 团队还开发了基于 bcache 的 bcachefs,这个文件系统在提供 SSD 缓存加速之余,还提供了 COW(Copy On Write 写时拷贝)、数据加密、数据备份和磁盘阵列等功能。不过此处我们已经设置了 xfs 文件系统,就不需要用到,下面的内容部分参考于 Bcache - ArchWiki

在 Ubuntu 中如果要启用,需要先下载 bcache 工具。幸运的是,apt 源中已经含有 bcache,只需要用以下命令即可下载安装:

sudo apt install bcache-tools

注意:后面的 bcache 初始化操作,将会清空硬盘上的所有数据,因此 bcache 应该是在文件系统初始化之前的步骤

然后,开始初始化固态硬盘和机械硬盘

# 创建一个后端设备(通常来说这是你的机械硬盘)。
# 后端设备可以是整个设备、一个分区或者其他任何的 block 设备。
make-bcache -B /dev/sdc1
make-bcache -B /dev/sdd1

# 创建一个缓存设备(这通常是你的固态硬盘)。
# 缓存设备可以是整个设备、一个分区或者其他任何的 block 设备
make-bcache -C /dev/sdb

如果上述命令成功执行了,那么现在在 /dev 目录下将多出两个设备:/dev/bcache0/dev/bcache1,分别对应着 /dev/sdc/dev/sdd。目前的缓存与后端设备的对应关系为:

SSD 缓存相关设备原始设备(分区)描述
/dev/sdbSSD 缓存盘
/dev/bcache0/dev/sdc1机械硬盘 1
/dev/bcache1/dev/sdd1机械硬盘 1

之后,我们将固态硬盘作为缓存设备,添加到机械硬盘(后端设备)的缓存列表中。首先查看当前的固态硬盘缓存设备的 UUID

ls /sys/fs/bcache/

通过这行命令可以看到一个目录下有一个 UUID,那就是缓存设备的 UUID 了。如果没有,则使用下面命令注册缓存设备

echo /dev/sdb > /sys/fs/bcache/register 

上面两条命令都能看到缓存设备的 UUID,把这个 UUID 记住,并添加到后端设备的缓存列表中,即可启用 SSD 缓存加速

echo UUID__from_previous_command > /sys/block/bcache0/bcache/attach
echo UUID__from_previous_command > /sys/block/bcache1/bcache/attach
2.2.2 bcache 操作

显示bcached设备的信息:

bcache-super-show /dev/sdXY

停止后端设备:

echo 1 > /sys/block/sdX/sdX[Y]/bcache/stop

让缓存设备脱机:

echo 1 > /sys/block/sdX/sdX[Y]/bcache/detach
2.2.3 bcache 模式

bcache 的工作模式一共有 4 种,分别是:

  • none:完全不缓存。
  • writeback:性能最好的缓存模式,所有读写请求在 SSD 上完成的时候就视作请求完成。注意,这种模式虽然能大幅提升性能,但是由于 SSD 上的数据将异步的与后端设备进行同步,因此如果同步的过程中遭遇断电,可能将导致 SSD 上的数据损失。尽管如此,bcache 在下一次重启后,会继续将上次未完成的异步同步过程继续完成,将数据损失的风险降到最低。
  • writethrough:默认的缓存模式,性能相较于上面一个有所下降。此模式下,所有读操作都将经过缓存层。不同的是,所有写入请求将同时对 SSD 以及后端设备进行,且仅当后端设备写入完成后,视作请求完成。这样的好处是,写入后一段时间内的读操作得到了缓存的性能提升。
  • writearound:性能较低的模式,但是能延长 SSD 的寿命。此模式下,仅仅缓存读操作。

后端设备运行时,可以查看后端设备所采用的缓存模式:

cat /sys/block/bcache0/bcache/cache_mode
cat /sys/block/bcache1/bcache/cache_mode

笔者考虑到 SSD 的寿命问题,以及自己对于写操作的缓存不是很感冒,因此选择修改缓存模式为 writearound 模式:

echo writearound > /sys/block/bcache0/bcache/cache_mode
echo writearound > /sys/block/bcache1/bcache/cache_mode

当然,各位读者如果有自己的需求,可以自行选择缓存模式。

2.3 xfs 文件系统

笔者选择 xfs 文件系统,主要看重了其作为 RHEL 发行版的默认文件系统的稳定性,同时性能也并不落后 ext4 多少。具体测评可见笔者另一篇博文:ext4、ntfs、xfs、btrfs、zfs、f2fs和reiserFS性能对比

在建立好缓存机制的后端设备之上,我们将开始对其格式化文件系统。这个文件系统可自行选择,不一定要是 xfs 文件系统,只是笔者选择了 xfs。

首先,安装 xfs 的相关工具:

sudo apt install xfsprogs

之后,对我们的后端设备分区建立文件系统,注意之后直接对 bcache* 的设备进行操作:

sudo mkfs.xfs /dev/bcache0
sudo mkfs.xfs /dev/bcache1

至此,xfs 文件系统已经在含有 SSD 缓存的硬盘上成功建立,可以挂载了。

2.4 fstab 开机自动挂载

文件系统建立完毕后,最好是设置其自动挂载。

此处,我打算将两个盘分别挂载于 /mnt/sdc/mnt/snapraid_backup。首先创建好挂载点:

sudo mkdir -p /mnt/sdc /mnt/snapraid_backup

然后通过查看 bcache* 设备的 UUID 并记下来:

sudo lsblk -f

使用编辑器打开 /etc/fstab,加入以下代码:

UUID=<bcache0 的 UUID> /mnt/sdc xfs defaults 0 0
UUID=<bcache1 的 UUID> /mnt/snapraid_backup xfs defaults 0 0

保存后重启系统,如果成功,则带有 SSD 缓存的机械硬盘就建立完毕了。


3. 总结

这一期,笔者终于把 SSD 缓存加速机制搭建好,也算是调教好 bcache 的功能了。在 bcache 的加持下,一段时间内的随机访问速度从原来的 2MB/s 提升到了现在的 30Mb/s,相较于原来的机械硬盘,已经有了巨大的提升

此外,本期还将文件系统一起创建出来,为下一期的 mergerfs 和 snapraid 的出场做好了铺垫。只有当 mergerfs + snapraid 建立起来,才算是真正的给数据建立起了安全的港湾。

同志们如果觉得我的内容有用,还请给我留个赞和评论,最好点个关注,俺都会很开心的!😘

最近看到很多水分很大的博文,内容朴素无华且同质化严重,俺终究还是不想变成这种营销号,愿开源精神长存

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐