在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版的内核。
主要功能:
1,可以使用单个超速缓存设备来超速缓存任意数量的后备设备。在运行时可以挂接和分离已装入及使用中的后备设备。
2,在非正常关机后恢复 - 只有在超速缓存与后备设备一致后才完成写入。
3,SSD 拥塞时限制传至 SSD 的流量。
4,高效的写回实施方案。脏数据始终按排序顺序写出。
5,稳定可靠,可在生产环境中使用。
代码安装:
代码可以从github或官方网站上获取,但是master的代码版本非常老,dev branch的代码比较新。两种版本是不同的团队维护的,但是不管哪一个版本,在Ubuntu上编译都挺顺利,到了Centos上就遇到重重阻碍,有些甚至莫名奇妙,最后放弃了。
官方网站上获取:
git clone http://evilpiepirate.org/git/linux-bcache.git
编译bcache-tools:
# cd bcache-tools/
# make & make install
Bcache配置
以下配置方法介绍中使用sdc表示cache device,也就是SSD的盘符,使用sdb表示backing device,也就是HDD的盘符。
格式化硬盘分区
应用硬盘到bcache模式之前需要将目标分区格式化为bcache,这一步会破坏磁盘分区中所有数据。方法和信息如下
# 如果磁盘是第一次使用,或完全是空的,第一步通常不用执行,这一步市为了擦除分区文件信息,如果挂载也要先卸载,否则会出现device busy的问题
# wipefs -a /dev/sdb /dev/sdc
# make-bcache -B /dev/sdb
UUID: 55d95b33-0736-4650-8fc0-c498c34c0feb
Set UUID: d62afd66-1f24-490b-985f-21176037e0ed
version: 1
block_size: 1
data_offset: 16
# 最后面的3个参数都可以不要,配置好以后可以通过控制节点进行修改
# make-bcache -C /dev/sdc -w4k -b1M --writeback
UUID: f5ec37ac-2a74-48e0-85ed-1ae23810a4d2
Set UUID: 529b2734-5e08-4724-9893-f28b37735ad6
version: 0
nbuckets: 32768
block_size: 1
bucket_size: 1024
nr_in_set: 1
nr_this_dev: 0
first_bucket: 1
缓存参数意义:
-B: 设置backing device
-C: 设置cache device
-w: block size (hard sector size of SSD),默认是2K,可使用--block=4K代替
-b: bucket size,可以使用--bucket=1M代替
设备注册
格式化完成后需要完成设备的注册,使内核获取设备,可能由于内核版本的问题,在实际配置中发现,会报错,提示无法向register节点写入信息,但是并不影响使用。
# echo /dev/sdb > /sys/fs/bcache/register
# echo /dev/sdc > /sys/fs/bcache/register
也可以通过下面的方式实现设备自动注册:
echo /dev/sd* > /sys/fs/bcache/register_quiet
完成注册以后会产生相应的系统节点,后面会有更详细的介绍:
/dev/bcache/
/dev/bcache
/sys/block/bcache0/
/sys/fs/bcache/
设备绑定
完成注册的backing device需要在使用之前绑定到bchache,否则功能无法启用。首先找到完成注册的backing device设备的
#ls /sys/fs/bcache/
60fbcc3b-4f8e-485b-9f3c-c258c157d614 register register_quiet
那么< UUID > = 60fbcc3b-4f8e-485b-9f3c-c258c157d614。
#echo <UUID> > /sys/block/bcache<n>/bcache/attach
重新启动系统,完成配置。
实际配置后的磁盘情况,其中使用sdq作为backing device,sdr是SSD硬盘,单独建立一个16G分区作为cache用于性能测试。
# lsblk
sdq 65:0 0 558.9G 0 disk
└─bcache0 252:0 0 558.9G 0 disk
sdr 65:16 0 745.2G 0 disk
└─sdr1 65:17 0 16G 0 part
└─bcache0 252:0 0 558.9G 0 disk
在/dev/目录下面你可以找到相应的bcache节点,相应的bcache会产生一些文件节点,比如下面的位置可以看到对应的绑定的两个磁盘:
# ls /sys/block/sdq/bcache/dev/slaves/
sdq sdr1
Bcache device状态查看
# bcache-super-show -f /dev/sdr
sb.magic ok
sb.first_sector 8 [match]
sb.csum 532A75DDACA80EC8 [match]
sb.version 1 [backing device]
dev.label (empty)
dev.uuid 0bb0de96-f7df-4fed-9280-b6e0615718da
dev.sectors_per_block 1
dev.sectors_per_bucket 1024
dev.data.first_sector 16
dev.data.cache_mode 1 [writeback]
dev.data.cache_state 0 [detached]
cset.uuid 538edd49-6d68-4fb0-8471-49a3346fae90
# bcache-super-show -f /dev/sds1
sb.magic ok
sb.first_sector 8 [match]
sb.csum 18DA32EC2B332BE2 [match]
sb.version 3 [cache device]
dev.label (empty)
dev.uuid 00a196c4-2af9-41b5-a450-e130ab1389e4
dev.sectors_per_block 8
dev.sectors_per_bucket 2048
dev.cache.first_sector 2048
dev.cache.cache_sectors 33552384
dev.cache.total_sectors 33554432
dev.cache.ordered yes
dev.cache.discard no
dev.cache.pos 0
dev.cache.replacement 0 [lru]
cset.uuid 60fbcc3b-4f8e-485b-9f3c-c258c157d614
设置文件系统和挂载
这个我就不同多说了,/dev/bcache可以当做普通盘符直接格式化所需的文件系统挂载:
#mkfs.ext4 /dev/bcache0
#mount /dev/bcache0 /mnt
停用设备
注销设备:
echo 1 >/sys/fs/bcache/<UUID>/unregister
停用bcache:
echo 1 >/sys/block/bcache0/bcache/stop
擦除磁盘残留数据:
sudo wipefs -a /dev/sdc
sudo wipefs -a /dev/sdb
工作模式
bcache有四种不同工作模式:
writethrough、writeback、writearouond、none
工作模式切换:
echo writeback > /sys/block/sdr/bcache/cache_mode