近期进行大容量下载读取的时候,经常由于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 ~ # lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda           8:0    1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdb           8:16   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdc           8:32   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdd           8:48   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sde           8:64   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdf           8:80   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdg           8:96   1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdh           8:112  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdi           8:128  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdj           8:144  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdk           8:160  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdl           8:176  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdm           8:192  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
sdn           8:208  1    20T  0 disk  
└─md127       9:127  0 280.1T  0 raid0 
  └─bcache0 252:0    0 280.1T  0 disk  /hdd
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  /hdd
└─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  

内核开启Bcache

modprobe bcache
lsmod |grep bcache

安装bcache-tools

apt install bcache-tools

格式化

wipefs -a /dev/md127
wipefs -a /dev/nvme1n1p2

添加数据盘

make-bcache -B /dev/md127

添加缓存盘

make-bcache -C /dev/nvme1n1p2

查看当前块信息

root@Debian ~ # lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda           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  
└─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  

获取缓存盘UUID

bcache-super-show /dev/nvme1n1p2
如下图所示,就是cset.uuid

绑定缓存盘

echo "0c07a77e-3735-410b-adae-60ea5d708009" >/sys/block/bcache0/bcache/attach

查看当前块信息

root@Debian ~ # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 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

设置开机自动挂载

查看设备UUID
blkid /dev/bcache0
添加到/etc/fstab
vim /etc/fstab
添加上面UUID
UUID=f9c51924-f6d5-4466-84ee-14fcfbb1bb14 /hdd xfs defaults 0 0

测试缓存性能

Yabs Fio测试

有缓

Block Size4k (IOPS)64k (IOPS)
Read240.07 MB/s (60.0k)1.53 GB/s (24.0k)
Write240.70 MB/s (60.1k)1.54 GB/s (24.1k)
Total480.77 MB/s (120.1k)3.08 GB/s (48.2k)
Block Size512k (IOPS)1m (IOPS)
--------- -------- ----
Read2.94 GB/s (5.7k)3.09 GB/s (3.0k)
Write3.10 GB/s (6.0k)3.29 GB/s (3.2k)
Total6.04 GB/s (11.8k)6.39 GB/s (6.2k)

无缓

Block Size4k (IOPS)64k (IOPS)
Read24.43 MB/s (6.1k)306.10 MB/s (4.7k)
Write24.44 MB/s (6.1k)307.72 MB/s (4.8k)
Total48.88 MB/s (12.2k)613.82 MB/s (9.5k)
Block Size512k (IOPS)1m (IOPS)
--------- -------- ----
Read772.93 MB/s (1.5k)1.88 GB/s (1.8k)
Write814.00 MB/s (1.5k)2.01 GB/s (1.9k)
Total1.58 GB/s (3.0k)3.90 GB/s (3.8k)