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以内核模块的形式编译进内核,编译方法介绍:自定义配置编译linux内核。
内核中有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文件内容参考:
Name: bcache-tools Version: 1.0.8 Release: %(date '+%Y%m%d%H')%{?dist} Summary: common functions. Group: xxx License: Properpity URL: xxx Source: bcache-tools-1.0.8.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: gcc Requires: glibc libuuid openssl kernel >= 3.10.0 %description This package contains the bcache tools for making bcache device %prep %setup -q -n bcache-tools-1.0.8 %build make %{?_smp_mflags} %install #rm -rf %{buildroot} echo %{buildroot} echo %{dist} echo %{release} mkdir -p %{buildroot}/usr/sbin/ mkdir -p %{buildroot}/lib/udev/ mkdir -p %{buildroot}/lib/udev/rules.d/ mkdir -p %{buildroot}/usr/share/man/man8/ mkdir -p %{buildroot}/usr/share/initramfs-tools/hooks/ mkdir -p %{buildroot}/usr/lib/initcpio/install/ mkdir -p %{buildroot}/lib/dracut//modules.d/90bcache/ make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %post %postun %files #/usr/sbin/make-bcache #/usr/sbin/* #/usr/sbin/bcache-super-show #/lib/udev/probe-bcache #/lib/udev/bcache-register #/lib/udev/* #/lib/udev/rules.d/69-bcache.rules #/usr/share/man/man8/* #/usr/share/initramfs-tools/hooks/bcache #/usr/lib/initcpio/install/bcache #/lib/dracut/modules.d/90bcache/module-setup.sh /usr/share/* /usr/* /lib/* %changelog
可以先执行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