Linux下SSD缓存加速之bcache试用
猫先生 • 2019 年 08 月 20 日
一重要客户,要求投标方提供SSD做缓存加速的方案,并提供测试报告。刚开始选择INTEL CAS,客户要求是SUSE系统,而INTEL CAS从去年8月就不再更新,只能支持到SUSE 12SP3,而客户要求操作系统必须是SUSE 12 SP4,所以不得不重新选择方案。
INTEL CAS软件支持的操作系统版本:
在Linux下,使用SSD为HDD加速,目前较为成熟的方案有:flashcache,enhanceIO,dm-cache,bcache等,多方面比较以后最终选择了bcache。
bcache 是一个 Linux 内核块层超速缓存。它允许使用一个或多个高速磁盘驱动器(例如 SSD)作为一个或多个速度低得多的硬盘的超速缓存。bcache 支持直写和写回,不受所用文件系统的约束。默认情况下,它只超速缓存随机读取和写入,这也是 SSD 的强项。它还适合用于台式机、服务器和高端储存阵列
主要功能:
1,可以使用单个超速缓存设备来超速缓存任意数量的后备设备。在运行时可以挂接和分离已装入及使用中的后备设备。
2,在非正常关机后恢复 - 只有在超速缓存与后备设备一致后才完成写入。
3,SSD 拥塞时限制传至 SSD 的流量。
4,高效的写回实施方案。脏数据始终按排序顺序写出。
5,稳定可靠,可在生产环境中使用。
关于bcache的更多介绍都在这里
CentOS和Ubuntu都可以使用bcache。我是在suse下安装的,记录下,防止忘记。
1,配置suse 下的zypper本地安装源zypper ar file:///yumdata localar :添加安装源
file:///yumdata suse安装镜像的路径
local zypper安装源的名称
zypper更多参数介绍:lr 列出所有定义的安装源。
ar 添加一个新的安装源。
rr 删除指定的安装源。
nr 重命名指定的安装源。
mr 修改指定的安装源。
ref 刷新所有安装源。
clean 清除本地缓存。
查看zypper安装源
2,安装bcache软件zypper install bcache-tools
3,加载内核modprobe bcache
lsmod |grep bcache
有如下输出内容,说明内核加载成功
查看当前磁盘:三个2TB HDD,一个400GB NVME SSD
4,绑定SSD和HDD
bcache有两种设备,一个是backing,一个是cache,backing指的就是存放数据的后端磁盘,cache很好理解,就是高速缓存盘SSD
bcache 可以支持将用来做缓存的ssd和做数据存放的hdd一次性注册,而不需要手动连接挂载ssd和hddmake-bcache -B /dev/sdb /dev/sdc /dev/sdd -C /dev/nvme0n1
5,查看bcache相关信息lsblk
cat /sys/block/bcache0/bcache/stateno cache:该backing device没有attach任何caching device
clean:一切正常,缓存是干净的
dirty:一切正常,已启用回写,缓存是脏的
inconsistent:遇到问题,后台设备与缓存设备不同步
查看缓存数据量cat /sys/block/bcache0/bcache/dirty_data
查看缓存模式,默认情况下是直通超速缓存模式cat /sys/block/bcache0/bcache/cache_mode
6,为了提高写的性能,需要修改缓存模式为写回echo writeback > /sys/block/bcache0/bcache/cache_mode
7,格式化使用mkfs.xfs /dev/bcache0
mkdir /cache
mount /dev/bcache0 /cache
8,开机自动挂载
由于bcache设备在每次重启后,N的值并不是固定的,有可能重启后,原先的bcahe0变为bcache1,而bcache1却变成了bcache0,。所以,不能将/dev/bcache作为磁盘挂载,需要使用该磁盘的UUID进行挂载,通过以下命令可以获取磁盘的UUIDblkid /dev/bcache0
然后将uuid写入/etc/fstab 实现开机自动挂载
9,使用fio测试性能
先安装编译工具。zypper install make gcc* kernel-devel kernel-headers
linux-be3v:~ # cd fio-3.15/
linux-be3v:~/fio-3.15 # ./configure
linux-be3v:~/fio-3.15 # make
linux-be3v:~/fio-3.15 # make install
10,测试有缓存fio -filename=/dev/bcache0 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=200G -numjobs=10 -runtime=60 -group_reporting -name=mytest
11,测试无缓存fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=200G -numjobs=10 -runtime=60 -group_reporting -name=mytest
后附常用bcache命令
1,查看cache 缓存盘的CACHE_SET_UUIDll /sys/fs/bcache
2,注销缓存盘
通过缓存盘的CACHE_SET_UUID,在/sys/fs/bcache//unregister写入1,即可进行注销echo 1 >/sys/fs/bcache/06e33354-7c21-4c52-990d-1a653617ab20/unregister
3,停用后端磁盘echo 1 > /sys/block/sdb/bcache/stop
echo 1 > /sys/block/sdc/bcache/stop
4,把 cache 上面的数据刷到后端磁盘上面echo 0 > /sys/block/bcache0/bcache/writeback_percent
5,fio测试工具常用参数说明filename=/dev/sdb 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30 本次的测试线程为30.
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量