前言
在 Linux 下,使用 SSD 为 HDD 加速,目前较为成熟的方案有:flashcache,enhanceIO,dm-cache,bcache 等,多方面比较以后最终选择了 bcache。 bcache 是一个 Linux 内核块层超速缓存。它允许使用一个或多个高速磁盘驱动器(例如 SSD)作为一个或多个速度低得多的硬盘的超速缓存。bcache 支持直写和写回,不受所用文件系统的约束。默认情况下,它只超速缓存随机读取和写入,这也是 SSD 的强项。它还适合用于台式机、服务器和高端储存阵列。CentOS 和 Ubuntu 都可以使用 bcache。bcache 是在 3.10 以后的版本加入 mainline 的,因此需要 3.10 以上的内核版本。但是笔者使用 Centos 7 在 3.10.0 的内核上进行配置时,发现无法生成相应的配置文件节点,测试过程中使用 4.3.3 版的内核。
首先我们先明白几个概念
既然是缓存,那自然就会想到缓存策略,bcache 支持三种缓存策略:
- writeback:回写策略,所有的数据将先写入缓存盘,然后等待系统将数据回写入后端数据盘中。(性能最好)
- writethrough:直写策略(默认策略),数据将会同时写入缓存盘和后端数据盘。
- writearoud:数据将直接写入后端磁盘。(性能最差)
主要功能:
1,可以使用单个超速缓存设备来超速缓存任意数量的后备设备。在运行时可以挂接和分离已装入及使用中的后备设备。
2,在非正常关机后恢复 - 只有在超速缓存与后备设备一致后才完成写入。
3,SSD 拥塞时限制传至 SSD 的流量。
4,高效的写回实施方案。脏数据始终按排序顺序写出。
5,稳定可靠,可在生产环境中使用。
Bcache 通过make-bcache命令完成 bcache 的创建,需要安装相关的工具包 bcache-tools。
我们通过编译安装 (Github)
https://github.com/g2p/bcache-tools/archive/refs/tags/v1.0.8.tar.gz
这是最新的 v1.0.8,如果要查看其他版本请访问
Tags · g2p/bcache-tools · GitHub
下载源码(我这里使用了 github 链接代理加速)
wget https://github.moeyy.xyz/https://github.com/g2p/bcache-tools/archive/refs/tags/v1.0.8.tar.gz
解压源码压缩包
tar -zxvf v1.0.8.tar.gz
安装依赖
yum install libblkid-devel -y
编译安装
如果没有 make 命令请自行安装软件包
make && make install
格式化硬盘分区
应用硬盘到 bcache 模式之前需要将目标分区格式化为 bcache,这一步会破坏磁盘分区中所有数据。方法和信息如下
# 如果磁盘是第一次使用,或完全是空的,第一步通常不用执行,这一步市为了擦除分区文件信息,如果挂载也要先卸载,否则会出现device busy的问题wipefs -a /dev/sdb /dev/sdc
创建 cache 也就是我们的 SSD 的分区作为缓存
缓存参数意义:
-B: 设置 backing device
-C: 设置 cache device
-w: block size (hard sector size of SSD),默认是 2K,可使用--block=4K 代替
-b: bucket size,可以使用--bucket=1M 代替
make-bcache -C /dev/sdc1
查看下
[root@master ~]# bcache-super-show /dev/sdc1
sb.magic ok
sb.first_sector 8 [match]
sb.csum C322F881FE092899 [match]
sb.version 0 [cache device]
dev.label (empty)
dev.uuid d3834fdd-d31d-4347-9da3-31064cae77ac
dev.sectors_per_block 1
dev.sectors_per_bucket 1024
dev.cache.first_sector 1024
dev.cache.cache_sectors 20968448
dev.cache.total_sectors 20969472
dev.cache.ordered no
dev.cache.discard no
dev.cache.pos 0
dev.cache.replacement 0 [lru]
cset.uuid 0609854c-f083-408b-8ea6-f90d4afd60c6
创建 backend
接着创建被加速的 backend
make-bcache -B /dev/sdb
这快硬盘就是我们的 HDD 机械硬盘
查看下
[root@master ~]# bcache-super-show /dev/sdb
sb.magic ok
sb.first_sector 8 [match]
sb.csum C71B7848F1913A17 [match]
sb.version 1 [backing device]
dev.label (empty)
dev.uuid da958760-83c8-4d05-9789-f8b371bd62aa
dev.sectors_per_block 1
dev.sectors_per_bucket 1024
dev.data.first_sector 16
dev.data.cache_mode 0 [writethrough]
dev.data.cache_state 0 [detached]
cset.uuid 9a492f33-f28d-41f8-8cb1-3cfd93d07885
可能出现的错误
- Device or resource busy 设备被占用,用 df 命令查看设备是不是已经被挂载使用,用 umount 取消挂载。
- Device /dev/sdX already has a non-bcache superblock 设备已存在文件系统,为避免文件丢失,请在备份文件后,使用
sudo wipefs -a /dev/sdX
清除设备。
设备绑定
往 backend 附加 cache
此处附加的 uuid,是在上面查询到的 cache 的 uuid 直接写 被加速的硬盘的 cset.uuid 就行了
echo 9a492f33-f28d-41f8-8cb1-3cfd93d07885 > /sys/block/bcache0/bcache/attach
那上面的操作有没有可以一次性解决的命令呢,是有的
make-bcache -C /dev/sdc -B /dev/sdb
-C /dev/sdc
:表示将/dev/sdc
设备作为 Bcache 的缓存设备。缓存设备用于加速主存储设备的读写操作也就是 SSD。-B /dev/sdb
:表示将/dev/sdb
设备作为 Bcache 的后端(backend)设备。后端设备是实际存储数据的设备,可以是机械硬盘。
通过这个命令,你可以将一个普通的块设备(例如硬盘)和一个更快的设备(例如固态硬盘)结合起来,利用快速的缓存设备提高数据的访问速度。
上面这条命令,就自动的完成了上面的几个步骤,执行完之后看下盘的状态
[root@master ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─bcache0 253:0 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
sdc 8:32 0 10G 0 disk
└─bcache0 253:0 0 20G 0 disk
sda 8:0 0 53G 0 disk
├─sda2 8:2 0 2G 0 part
├─sda3 8:3 0 50.7G 0 part /
└─sda1 8:1 0 300M 0 part /boot
看到了两个盘都多了一个 bcache0,这个可以理解为一块缓存盘和一个被加速盘的总体
格式化这个 bcache0 就可以当成正常分区来使用了
改成回写缓存模式
echo "writeback" > /sys/block/bcache0/bcache/cache_mode
这里注意下 bcache 默认创建的分区(bcache0)是 MBR 格式的,我前面的文章提到过 MBR 最大支持的容量为 3T
如果没有上面的路径,可能是由于你的[内核]没有包含 bcache 模块,解决方法查看我们另外一篇文章
Linux 内核编译添加 bcache
卸载 bcache 缓存设备
查看 cache 的 uuid
bcache-super-show /dev/sdc
删除缓存盘
要将缓存盘从当前的后端磁盘删除,只需将缓存盘的 cset.uuid detach 到 bcache 磁盘即可实现
echo c0d007af-93a9-4bf9-b067-926bd588983c > /sys/block/bcache0/bcache/detach
注销缓存盘
注销缓存前,请先确保当前缓存盘没有作为缓存使用,即通过 lsblk 看不到缓存磁盘下面的 bcahe 设备,如果当前磁盘正在使用,而进行注销操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。
通过缓存盘的 cset.uuid,在 /sys/fs/bcache/<cset.uuid>/unregister写入 1,即可进行注销操作,操作如下:
echo c0d007af-93a9-4bf9-b067-926bd588983c > /sys/fs/bcache/c0d007af-93a9-4bf9-b067-926bd588983c/unregister
Bcache 调优
1.打开顺序 IO 缓存 (默认没有开启)
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
2.关闭读写拥塞控制命令
如果你的 SSD 足够强大,可以不跟踪,减少跟踪的开销。
bcache 会跟踪每个 IO,如果 IO 的时间超过阈值,则旁路 cache 设备,直接读写 backing 设备。
关闭旁路的另一个好处是,所有的离散读写都会经过 cache 设备,从而不会导致 cache missing。
默认情况下当读请求超过 2ms,写请求超过 20ms 时,旁路 cache 设备。
echo 0 > /sys/fs/bcache/{cache set uuid}/congested_read_threshold_us
echo 0 > /sys/fs/bcache/{cache set uuid}/congested_write_threshold_us
3.设置磁盘的预读缓存
echo "8192" > /sys/block/sdb/queue/read_ahead_kbecho "8192" > /sys/block/sdc/queue/read_ahead_kb
4.提高缓存盘缓存比例
echo 40 > /sys/block/bcache0/bcache/writeback_percent
一般 writeback_percent 常见设定是默认的 10%,因为比例越高意味越多脏数据还没刷入后端数据盘,如果 writeback 模式,缓存盘挂了意味着数据损坏。
Comments NOTHING