本文主要是介绍使用bcache加速hdd的原理及简单应用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
bcache 是一种简单有效的方法,通过使用小容量高速磁盘(如 SSD )让大容量的低速磁盘(通常为 HDD )展现出与高速磁盘相近的性能。例如我们在 ceph 生产环境中,利用 bcache 将小容量的 SSD 盘作为一组大容量 HDD 的缓存,达到节省成本和提高性能的效果。
bcache内核模块仅在Linux 3.10及以上版本支持,因此使用Bcache,需要将内核升级到3.10及以上版本,并在内核配置项中打开Bcache模块。
bcache中的常用术语
backing device
后端存储盘,通常为低俗大容量磁盘,是实际保存数据的磁盘cache device
缓存盘,通常指高速小容量磁盘dirty cache
脏缓存,数据暂时只存在于缓存盘而未刷新到存储盘中writeback
回写,数据写入时, 只要缓存盘写入成功, 写入请求就立即返回成功,缓存盘中的数据会定期刷写到后端存储盘中writethrough
直写,数据写入时, 必须缓存盘和存储盘都写入成功, 写入请求才返回成功,因此该模式对于写入性能无提升,适用于读多写少的场景,可以保证数据的强一致性
原理简介
磁盘缓存的概念其实一直存在,比如操作系统中的内存。当从磁盘读取数据时,数据会被复制到 RAM 中。如果数据已经存在于 RAM 中,就会直接从 RAM 读取,而不是再次从磁盘读取。当数据写入磁盘时,它会先写入 RAM,然后过一会儿再写入磁盘。由于 RAM 是易失的,数据在 RAM 中停留的时间非常短。
bcache 与此类似,只是它有多种缓存操作模式。写入数据较快的模式是 writeback。它的工作方式与 RAM 相同,只不过 RAM 被 NVME SSD 设备所取代。数据可能在缓存中停留更长时间,甚至永久停留,因此存在一定的风险,例如当 SSD 损坏时,只存在于缓存中的数据会丢失,这很可能会导致整个文件系统无法访问。
bcache的简单创建
准备一块SSD(本文中为sdb,10GB)和一块HDD(本文中为sdc,100GB),在创建bcache前我们先来对两块盘的性能做简单测试:
# 在裸设备上创建文件系统并挂载
[root@ecs-91176055 /]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=655360 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=1, sparse=1, rmapbt=0= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=2621440, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.[root@ecs-91176055 /]# mkfs.xfs /dev/sdc
meta-data=/dev/sdc isize=512 agcount=4, agsize=6553600 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=1, sparse=1, rmapbt=0= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=26214400, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=12800, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.[root@ecs-91176055 /]# mkdir /ssd
[root@ecs-91176055 /]# mkdir /hdd
[root@ecs-91176055 /]# mount /dev/sdb /ssd
[root@ecs-91176055 /]# mount /dev/sdc /hdd# 进行简单的读写性能测试
# ssd写性能
[root@ecs-91176055 /]# dd if=/dev/zero of=/ssd/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 32.161 s, 163 MB/s# hdd写性能
[root@ecs-91176055 /]# dd if=/dev/zero of=/hdd/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 242.547 s, 21.6 MB/s# ssd读性能
[root@ecs-91176055 /]# dd if=/ssd/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 32.1591 s, 163 MB/s# hdd读性能
[root@ecs-91176055 /]# dd if=/hdd/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 148.681 s, 35.3 MB/s# 测试完成卸载卷
[root@ecs-91176055 /]# umount /dev/sdb
[root@ecs-91176055 /]# umount /dev/sdc
我们可以得到如下数据:
写速度 | 读速度 | |
---|---|---|
SSD | 163MB/s | 163MB/s |
HDD | 21.6MB/s | 35.3MB/s |
接下来使用sdb作cache device
,sdc作backing device
:
# 加载bcache内核模块
[root@ecs-91176055 ~]# modprobe bcache
# 验证内核模块是否加载
[root@ecs-91176055 ~]# lsmod | grep bcache
bcache 270336 0
crc64 16384 1 bcache# 安装bcache-tools
[root@ecs-91176055 ~]# yum install bcache-tools -y# bcache无法使用分区或已有文件系统的磁盘,因此先使用wipefs擦除磁盘上的元数据信息
[root@ecs-91176055 ~]# wipefs -a /dev/sdb
/dev/sdb: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
[root@ecs-91176055 ~]# wipefs -a /dev/sdc
/dev/sdc: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42# 创建backing device
[root@ecs-91176055 ~]# bcache make -B /dev/sdc
Name /dev/sdc
Label
Type data
UUID: 051db5a8-0c82-4c4c-a0a9-25da423b950c
Set UUID: e41856dc-f3ab-4672-84cf-56507d10bf9a
version: 1
block_size_in_sectors: 1
data_offset_in_sectors: 16# 注册设备
[root@ecs-91176055 ~]# bcache register /dev/sdc# 创建cache device
[root@ecs-91176055 ~]# bcache make -C /dev/sdb
Name /dev/sdb
Label
Type cache
UUID: 8ba34ba9-ca35-4c51-ba3d-cb08e6777047
Set UUID: 2f1f6fd1-6549-4b77-9a57-0fbe0c5669aa
version: 0
nbuckets: 20480
block_size_in_sectors: 1
bucket_size_in_sectors: 1024
nr_in_set: 1
nr_this_dev: 0
first_bucket: 1
/dev/sdb blkdiscard beginning...done# 注册设备
[root@ecs-91176055 ~]# bcache register /dev/sdb# 将存储盘挂载到缓存盘
[root@ecs-91176055 ~]# bcache attach /dev/sdb /dev/sdc# 设置写入策略为writeback
[root@ecs-91176055 ~]# bcache set-cachemode /dev/sdc writeback# 查看bcache设备状态
[root@ecs-91176055 ~]# bcache show
Name Type State Bname AttachToDev
/dev/sdb 3 (cache) active N/A N/A
/dev/sdc 1 (data) clean(running) bcache0 /dev/sdb[root@ecs-91176055 /]# mkdir /bcache
# 挂载bcache设备
[root@ecs-91176055 /]# mount /dev/bcache0 /bcache# bcache写性能
[root@ecs-91176055 /]# dd if=/dev/zero of=/bcache/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 65.822 s, 79 MB/s# bcache读性能
[root@ecs-91176055 /]# dd if=/bcache/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 65 s, 80 MB/s
得到如下数据:
写速度 | 读速度 | |
---|---|---|
SSD | 163MB/s | 163MB/s |
HDD | 21.6MB/s | 35.3MB/s |
bcache | 79MB/s | 80MB/s |
总结
可以看到,理论上期望的 bcache 设备速度与缓存设备一样快是不可能实现的。平均而言,bcache 的速度明显较慢,但较单一HDD已经有较大提升。
以下命令提供了必要的优化,以从 bcache 设备获得更好的性能。
echo 0 > /sys/block/bcache0/bcache/cache/congested_write_threshold_us
echo 0 > /sys/block/bcache0/bcache/cache/congested_read_threshold_us
echo 600000000 > /sys/block/bcache0/bcache/sequential_cutoff
echo 40 > /sys/block/bcache0/bcache/writeback_percent
有关bcache的更多信息可以参考:https://www.kernel.org/doc/html/latest/admin-guide/bcache.html
这篇关于使用bcache加速hdd的原理及简单应用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!