1702 字
9 分钟
Hetzner服务器使用Bcache和nvme加速HDD
近期进行大容量下载读取的时候,经常由于hdd的写入瓶颈问题,造成写入速度不稳定。经过从100MB/S直接掉到B/S,也就是我们所称的卡IO。
Bcache简介
bcache 是一个 Linux 内核块层超速缓存。它允许使用一个或多个高速磁盘驱动器(例如 SSD)作为一个或多个速度低得多的硬盘的超速缓存。bcache 支持直写和写回,不受所用文件系统的约束。
主要功能:1,可以使用单个超速缓存设备来超速缓存任意数量的后备设备。在运行时可以挂接和分离已装入及使用中的后备设备。2,在非正常关机后恢复 - 只有在超速缓存与后备设备一致后才完成写入。3,SSD 拥塞时限制传至 SSD 的流量。4,高效的写回实施方案。脏数据始终按排序顺序写出。5,稳定可靠,可在生产环境中使用。
以下教程基于Debian12
准备条件
14块22T的HDD组成的raid阵列
nvme0n1 作为系统盘 7.68T
nvme1n1 作为缓存盘 7.68T
格式化好HDD 和 缓存所用的NV
下面是已完成的最终情况
root@Debian ~ # lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdb 8:16 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdc 8:32 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdd 8:48 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsde 8:64 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdf 8:80 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdg 8:96 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdh 8:112 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdi 8:128 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdj 8:144 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdk 8:160 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdl 8:176 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdm 8:192 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddsdn 8:208 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk /hddnvme1n1 259:0 0 7T 0 disk├─nvme1n1p1 259:2 0 1G 0 part├─nvme1n1p2 259:3 0 7T 0 part│ └─bcache0 252:0 0 280.1T 0 disk /hdd└─nvme1n1p3 259:4 0 1M 0 partnvme0n1 259:1 0 7T 0 disk├─nvme0n1p1 259:5 0 1G 0 part /boot├─nvme0n1p2 259:6 0 7T 0 part /└─nvme0n1p3 259:7 0 1M 0 part
内核开启Bcache
modprobe bcachelsmod |grep bcache
安装bcache-tools
apt install bcache-tools
格式化
wipefs -a /dev/md127wipefs -a /dev/nvme1n1p2
添加数据盘
make-bcache -B /dev/md127
添加缓存盘
make-bcache -C /dev/nvme1n1p2
查看当前块信息
root@Debian ~ # lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdb 8:16 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdc 8:32 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdd 8:48 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksde 8:64 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdf 8:80 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdg 8:96 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdh 8:112 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdi 8:128 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdj 8:144 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdk 8:160 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdl 8:176 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdm 8:192 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disksdn 8:208 1 20T 0 disk└─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disknvme1n1 259:0 0 7T 0 disk├─nvme1n1p1 259:2 0 1G 0 part├─nvme1n1p2 259:3 0 7T 0 part└─nvme1n1p3 259:4 0 1M 0 partnvme0n1 259:1 0 7T 0 disk├─nvme0n1p1 259:5 0 1G 0 part /boot├─nvme0n1p2 259:6 0 7T 0 part /└─nvme0n1p3 259:7 0 1M 0 part
获取缓存盘UUID
bcache-super-show /dev/nvme1n1p2如下图所示,就是cset.uuid

绑定缓存盘
echo "0c07a77e-3735-410b-adae-60ea5d708009" >/sys/block/bcache0/bcache/attach
查看当前块信息
root@Debian ~ # lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdb 8:16 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdc 8:32 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdd 8:48 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sde 8:64 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdf 8:80 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdg 8:96 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdh 8:112 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdi 8:128 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdj 8:144 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdk 8:160 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdl 8:176 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdm 8:192 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk sdn 8:208 1 20T 0 disk └─md127 9:127 0 280.1T 0 raid0 └─bcache0 252:0 0 280.1T 0 disk nvme1n1 259:0 0 7T 0 disk ├─nvme1n1p1 259:2 0 1G 0 part ├─nvme1n1p2 259:3 0 7T 0 part │ └─bcache0 252:0 0 280.1T 0 disk └─nvme1n1p3 259:4 0 1M 0 part nvme0n1 259:1 0 7T 0 disk ├─nvme0n1p1 259:5 0 1G 0 part /boot├─nvme0n1p2 259:6 0 7T 0 part /└─nvme0n1p3 259:7 0 1M 0 part
查看缓存状态
-
no cache:该backing device没有attach任何caching device
-
一切正常,缓存是干净的
-
一切正常,已启用回写,缓存是脏的
-
遇到问题,后台设备与缓存设备不同步
cat /sys/block/bcache0/bcache/state
更改缓存策略
Bcache有三种缓存策略
-
writeback回写策略:数据先写入到缓存磁盘,再等待系统将缓存磁盘数据刷到后端磁盘
-
writethrough写通策略:数据会同时写入缓存磁盘和数据磁盘(默认是该模式)
-
writearound直达策略:数据直接写入后端磁盘。
为了性能,这里改为 writeback回写策略
查看缓存模式cat /sys/block/bcache0/bcache/cache_mode修改缓存策略 echo writeback > /sys/block/bcache0/bcache/cache_mode允许缓存顺序I/O(非常重要)echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

格式化数据盘
mkfs.xfs /dev/bcache0

设置开机自动挂载
查看设备UUIDblkid /dev/bcache0添加到/etc/fstabvim /etc/fstab添加上面UUIDUUID=f9c51924-f6d5-4466-84ee-14fcfbb1bb14 /hdd xfs defaults 0 0
测试缓存性能
Yabs Fio测试
有缓
Block Size | 4k (IOPS) | 64k (IOPS) |
---|---|---|
Read | 240.07 MB/s (60.0k) | 1.53 GB/s (24.0k) |
Write | 240.70 MB/s (60.1k) | 1.54 GB/s (24.1k) |
Total | 480.77 MB/s (120.1k) | 3.08 GB/s (48.2k) |
Block Size | 512k (IOPS) | 1m (IOPS) |
------ | --- ---- | ---- ---- |
Read | 2.94 GB/s (5.7k) | 3.09 GB/s (3.0k) |
Write | 3.10 GB/s (6.0k) | 3.29 GB/s (3.2k) |
Total | 6.04 GB/s (11.8k) | 6.39 GB/s (6.2k) |
无缓
Block Size | 4k (IOPS) | 64k (IOPS) |
---|---|---|
Read | 24.43 MB/s (6.1k) | 306.10 MB/s (4.7k) |
Write | 24.44 MB/s (6.1k) | 307.72 MB/s (4.8k) |
Total | 48.88 MB/s (12.2k) | 613.82 MB/s (9.5k) |
Block Size | 512k (IOPS) | 1m (IOPS) |
------ | --- ---- | ---- ---- |
Read | 772.93 MB/s (1.5k) | 1.88 GB/s (1.8k) |
Write | 814.00 MB/s (1.5k) | 2.01 GB/s (1.9k) |
Total | 1.58 GB/s (3.0k) | 3.90 GB/s (3.8k) |
Hetzner服务器使用Bcache和nvme加速HDD
https://catcat.blog/hetzner-bcache-hdd.html