在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