当前位置:网站首页>家用 NAS 服务器(3)| SSD缓存加速机械硬盘
家用 NAS 服务器(3)| SSD缓存加速机械硬盘
2022-07-23 18:12:00 【林地宁宁】
家用 NAS 服务器(3)| SSD缓存加速机械硬盘
原文地址:CSDN 博文
前文提要:家用 NAS 服务器(2)| HyperV的Winserver 2022和Ubuntu 22.04双系统
文章目录
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/sdb | SSD 缓存盘 |
/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 多少。之后有机会,笔者会单独出一期关于 Linux 下各大文件系统的比较的文章,届时再详细讨论。
在建立好缓存机制的后端设备之上,我们将开始对其格式化文件系统。这个文件系统可自行选择,不一定要是 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 建立起来,才算是真正的给数据建立起了安全的港湾。
同志们如果觉得我的内容有用,还请给我留个赞和评论,最好点个关注,俺都会很开心的!
最近看到很多水分很大的博文,内容朴素无华且同质化严重,俺终究还是不想变成这种营销号,愿开源精神长存!
边栏推荐
- 测试如何应对新的开发模式?
- elk笔记25--快速体验APM
- 二叉树高度 [log2n]+1与log2(n+1)是否相等
- 在Hyper-V中手动将.avhd合并到.vhd
- 为啥一问 JVM 就 懵B ?
- FormatDateTime的用法
- Summarize some recent tricks
- 时代潮头,华为将风帆对准数字金融的风与海
- H7-TOOL的CANFD/CAN接口脱机烧写操作说明, 已经更新(2022-07-12)
- R语言ggplot2可视化:使用ggplot2可视化散点图、使用ggpubr包的theme_classic2函数设置可视化图像为经典主题(classic theme with axis lines)
猜你喜欢

USB3.0: layout guide for vl817q7-c0

PowerCLi 管理VMware vCenter 一键批量部署OVA

canvas绘制文本和清除绘制

吃透Chisel语言.21.Chisel时序电路(一)——Chisel寄存器(Register)详解

(CVPR-2022)BiCnet
![Atcoder regular contest 144 [VP record]](/img/8c/bcffb95cb709087103bb79b8a358d1.png)
Atcoder regular contest 144 [VP record]

Weights & biases (I)

Type-C Bluetooth speaker single C-Port rechargeable OTG solution

作为一名后台开发人员,你必须知道的两种过滤器

PowerCLi 将虚拟机从Host01主机移动到Host02主机
随机推荐
Delete strategy of redis expired key [easy to understand]
R语言使用quantile函数计算向量数据或者dataframe指定数据列的分位数(百分位数)
(CVPR-2022)BiCnet
(干货)结合Scikit-learn介绍几种常用的特征选择方法
虹科干货 | 教您如何解析MODBUS中的浮点型数据
入门数据库days1
Codeworks round 805-808 [partial solution]
Calculation of structure size (structure memory alignment)
[C language] program environment and preprocessing
Technical scheme of face recognition system
进程调度的基本过程
paddle实现,多维时序数据增强 ,mixup(利用beta分布制作连续随机数)
GPS北斗时钟服务器(NTP网络时钟系统)施工部署方案
Socat uses "suggestions collection"
Leetcode daily question (1514. path with maximum probability)
What is weak network testing? Why should weak network test be carried out? How to conduct weak network test? "Suggested collection"
Type-C Bluetooth speaker single C-Port rechargeable OTG solution
.net core implements background tasks (scheduled tasks) longbow Tasks component (III)
Element positioning in selenium is correct, but the operation fails. Six solutions are all finalized
elk筆記25--快速體驗APM