linux块设备缓存bcache

1 Bcache介绍
Bcache是一种缓存技术,它是根据SSD的特性设计的,由于SSD的随机读写速度要比普通硬盘的随机读写快N多倍,但是一般SSD的容量小且贵,当然土豪除外,所以我们可以综合SSD的读写速度快和HDD的容量大的优点,这就可以使用bcache来做到,将SSD作为HDD的缓存磁盘,,即保证了读写速度,又省了一大笔资金,何乐不为。

2 使用Bcache的工作准备
由于bcache是在kernel 3.10之后才加上的,所以需要确保你的内核是3.10以上的,可以使用命令uname -a查看你的内核版本:

[root@localhost ~]# uname -a
Linux thinstack-qtGr8j 3.10.0-514.26.2.el7.x86_64 #1 SMP Fri Jun 22 18:59:37 CST 2018 x86_64 x86_64 x86_64 GNU/Linux

首先检测下你的内核中有没有包含bcache模块,检测的方式有两种:
(1)查看是否存在于内核中,检查/sys/fs/bcache目录是否存在,没有则说明内核中没有bcache
(2)查看bcache是否以内核模块的形式存在,检查/lib/modules/<$version>/kernel/drivers/md/bcache目录是否存在,如果存在则可以运行modprobe bcache命令来加载bcache模块,不存在则说明内核中没有bcache。
默认内核并没有将bcache编译进内核,可以通过下载内核源码包重新编译将bcache以内核模块的形式编译进内核,编译方法将会写到下一篇博客。

内核中有bcache模块后,要使用bcache还需要一个工具:bcache-tools,它提供了make-bcache工具, centos源上是没有这个rpm包的,需要自己下载源码然后进行编译,在进行编译前需要下载几个依赖包:

yum install pkgconfig libblkid-devel

下载rpm的一些打包工具包:

yum install rpmdevtools rpm-build

可以去github上下载源代码:https://github.com/g2p/bcache-tools/tree/v1.0.8
然后编写bcache-tools-1.0.8.spec文件,spec文件内容参考:

可以先执行rpmdev-setuptree命令在home目录下生成rpm目录
将源代码打包成tar.gz的压缩包放入~/rpmbuild/SOURCES/目录下:

tar -zcvf ~/rpmbuild/SOURCES/bcache-tools-1.0.8.tar.gz bcache-tools-1.0.8

将bcache-tools-1.0.8.spec文件复制到~/rpmbuild/SPECS/目录下,然后执行:

rpmbuild -bb ~/rpmbuild/SPECS/ bcache-tools.spec

同时在编译过程中如果出现这样的错误,提示找不到errno.h等头文件,说明缺少一些头文件了,这时去看下/usr/include/linux目录是否存在,如果不存在,先安装kernel-headers的rpm包,如果没出错则在~/rpmbuild/RPMS/x86_64/目录下看到bcache-tools的rpm包。

3 使用Bcache
3.1 添加缓存磁盘操作
首先选择一个SSD盘作为缓存磁盘,当然如果只是测试,那么选择一个普通硬盘来做也是可以的,假设选择的盘是/dev/sdb,则使用命令来创建缓存盘:

[root@localhost ~]# make-bcache -C /dev/sdb
UUID:    60a170c4-fde4-40af-aa1c-97ed79139699
Set UUID:    b69c5773-c8a9-49b1-89cc-e0638652977c
version:    0
nbuckets:    65536
block_size:    1
bucket_size:    1024
nr_in_set:    1
nr_this_dev:    0
first_bucket:    1

选择一个普通硬盘作为缓存磁盘的后端磁盘,这里假设选择的盘是/dev/sdc,则使用命令来创建后端磁盘:

[root@localhost ~]# make-bcache -B /dev/sdc
UUID:    cbad64dd-6717-49b5-b22c-e006ab7cdb0c
Set UUID:    a9bf6ced-10e1-4101-a80f-f2b7efc45ff3
version:    1
block_size:    1
data_offset:    16

使用lsblk查看磁盘状态,可以看到后端磁盘已经有一个bcache0,同时存在设备/dev/bcache0:

[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk 
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 1G 0 part [SWAP]
└─sda3 8:3 0 18.8G 0 part /
sdb 8:16 0 32G 0 disk 
sdc 8:32 0 32G 0 disk 
└─bcache0 252:0 0 32G 0 disk

但这时还需将bcache0绑定到缓存磁盘中,首先查找缓存盘的uuid:

[root@localhost ~]# bcache-super-show /dev/sdb
sb.magic    ok
sb.first_sector    8 [match]
sb.csum    F4550D6F828E6162 [match]
sb.version    3 [cache device]

dev.label    (empty)
dev.uuid    60a170c4-fde4-40af-aa1c-97ed79139699
dev.sectors_per_block    1
dev.sectors_per_bucket    1024
dev.cache.first_sector    1024
dev.cache.cache_sectors    67107840
dev.cache.total_sectors    67108864
dev.cache.ordered    yes
dev.cache.discard    no
dev.cache.pos    0
dev.cache.replacement    0 [lru]

cset.uuid    b69c5773-c8a9-49b1-89cc-e0638652977c

最后一行的cset.uuid的值就是我们要找的uuid,然后进行attach操作完成添加缓存磁盘:
[root@localhost~]# echo "b69c5773-c8a9-49b1-89cc-e0638652977c" > /sys/block/bcache0/bcache/attach
此时查看磁盘状态:

[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk 
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 1G 0 part [SWAP]
└─sda3 8:3 0 18.8G 0 part /
sdb 8:16 0 32G 0 disk 
└─bcache0 252:0 0 32G 0 disk 
sdc 8:32 0 32G 0 disk 
└─bcache0 252:0 0 32G 0 disk

可以看到已经添加成功了。
要使用的话就是将/dev/bcache0进行格式化并挂载到一个目录下来使用,比如:

mkfs.ext4 -F /dev/bcache0 
mkdir -p /test
mount /dev/bcache0 /test/

概念:数据是先写到缓存磁盘,缓存磁盘再将数据刷回到后端磁盘,后端磁盘是真正存储数据的地方,缓存磁盘相当于是中间转接作用。

可能遇到的错误:
在使用make-bcache命令对一个磁盘操作时可能会失败,一般情况是因为该磁盘有其它数据,可以使用wipefs -a /dev/xxx来擦除该磁盘的头部超级块信息,然后再使用make-bcache命令,当然再使用wipefs命令时确保该磁盘的数据已经无用。

3.2 删除缓存磁盘
删除缓存磁盘其实就是添加缓存磁盘顺序倒着放
先将bcache0从缓存磁盘中detach掉:
echo "b69c5773-c8a9-49b1-89cc-e0638652977c" > /sys/block/bcache0/bcache/detach
注销掉缓存磁盘:
echo 1 > /sys/fs/bcache/b69c5773-c8a9-49b1-89cc-e0638652977c/unregister
注销成功会看到 /sys/fs/bcache/该目录下没有b69c5773-c8a9-49b1-89cc-e0638652977c了
最后停掉后端磁盘的缓存磁盘:
如果刚才有挂载操作则需要先umount掉:
umount /dev/bcache0
echo 1 >/sys/block/bcache0/bcache/stop
此时使用lsblk查看则会看到没有bcache了

4 Bcache的三种缓存策略
(1)writeback回写策略:数据先写入到缓存磁盘,再等待系统将缓存磁盘数据刷到后端磁盘
(2)writethrough写通策略:数据会同时写入缓存磁盘和数据磁盘(默认是该模式)
(3)writearound直达策略:数据直接写入后端磁盘
这些策略是可以动态修改的,比如修改到writeback的修改方式(建议使用writeback):
echo writeback > /sys/block/bcache/bcache/cache_mode

5 Bcache的一些开机启动配置
5.1 开机自动挂载
比如上方提到的挂载bcache0到一个目录,则需要将需要挂载信息添加到/etc/fstab文件里,这样开机时才会自动挂载,比如在/etc/fstab文件中添加一行:
echo UUID=c4d9c15f-3d6d-446b-8cb5-3d51a9400a22 /test/ xfs noatime,nobarrier,inode64,delaylog 0 0 >> /etc/fstab
这个uuid可以通过命令blkid /dev/bcache0获得:
/dev/bcache0: UUID="c4d9c15f-3d6d-446b-8cb5-3d51a9400a22" TYPE="xfs"
当然删除缓存磁盘后也别忘了把这行删掉,否则系统启动时会启动不起来,进入紧急模式。

5.2 开机自动加载Bcache模块
如果不设置开机自动加载该模块,则启动后会看不到bcache信息
创建/etc/sysconfig/modules/bcache.modules该文件
输入:

#!/bin/sh
modprobe bcache >/dev/null 2>&1
exit 0

chmod 777 /etc/sysconfig/modules/bcache.modules

6.Bcache的性能调优
bcache有很多配置选项和可调的参数,默认值适合于典型配置
(1)如果写入性能差,可以尝试将其写策略调为回写策略
echo writeback > /sys/block/bcache0/cache_mode

(2)默认情况下,bcache不会缓存顺序IO和大文件,所以顺序写性能应该没什么提升,可以打开顺序IO缓存:
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
还可以调整backing设备的顺序IO阈值,默认是4M,也就是说如果bcache设备的连续IO达到4MB以上时是直接读写backing盘,不会走SSD缓存盘,如果要设置成8M,则可如下:
echo 8M > /sys/block/bcache0/bcache/sequential_cutoff

(3)防止cache设备成为瓶颈
这种情况最可能发生在一块缓存磁盘作为多个普通盘的缓存磁盘,写入或读取处理不过来时,就会形成堵塞,这时我们可以关闭拥塞控制项,默认情况下,当读请求超过2ms,写请求超过20ms时就会直接读写backing盘。
关闭读写拥塞控制命令:
echo 0 > /sys/fs/bcache/<cache set uuid>/congested_read_threshold_us
echo 0 > /sys/fs/bcache/<cache set uuid>/congested_write_threshold_us

猜你喜欢

转载自www.cnblogs.com/luohaixian/p/9280141.html