Bcache详解及踩坑记录

Bcache详解及踩坑记录

首页休闲益智Cut it average更新时间:2024-04-16

关注公众号 singless ,后台回复bCache,获取bcache相关资料

1 介绍

1.1 背景介绍

Bcache是Linux内核块设备层的软件驱动,使用高速存储设备为传统机械磁盘做IO缓存,经常访问的热数据会缓存在固态硬盘中并直接返回给应用程序,大大提升了具有热数据访问特征的应用场景的IO性能。

Bcache在Linux kernel v3.10被合并到官方内核,Linux kernel v5.3版本之后趋于稳定,目前支持Bcache的企业级Linux多采用Linux kernel v5.14及之后的版本。suse Linux 和SUSE Euler Linux中包含了Linux kernel v5.19中的稳定性和性能修复。

Bcache的作者为Kent Overstreet,其同时也编写了bcachefs。bcache目前的维护者为Coly Li,目前供职于SUSE公司。

1.2 功能介绍

Bcache设备:应用程序直接读写的虚拟块设备

Cache设备:存储热数据的高速设备(固态硬盘,非易失性内存等)

Backing设备:传统机械硬盘或低速固态硬盘

bcache的缓存模式

查看缓存模式

root@node1:~# cat /sys/block/bcache1/bcache/cache_mode [writethrough] writeback writearound none

bcache的缓存状态

root@node2:~# cat /sys/block/bcache0/bcache/state clean2 创建Bcache设备

创建bcache设备需要用到bcache-tools工具,ubuntu和suse中默认已安装bcache-tool工具。

root@ceph-1:~# apt install bcache-tools -y ##安装bcache工具,ubuntu及suse默认已安装 root@ceph-1:~# modprobe bcache ##导入模块 root@ceph-1:~# lsmod |grep bcache bcache 245760 0 crc64 16384 1 bcache root@ceph-1:~# make-bcache -C /dev/nvme0n1 -B /dev/sdc --writeback ##-C指定ssd或nvme加速盘,-B指定后端hdd慢速设备,--writeback指定缓存模式为writeback

通常系统会自动注册cache设备和backing设备并自动生成虚拟的bcache设备/dev/bcache0

root@ceph-1:~# echo /dev/nvme0n1 > /sys/fs/bcache/register root@ceph-1:~# echo /dev/sdb > /sys/fs/bcache/register

root@ceph-1:~# echo <cache-set-UUID> > /sys/block/bcache0/bcache/attach

<cache-set-UUID>是在格式化cache设备时为高速缓存设备生成的全局唯一标识,可以在/sys/fs/bcache/目录下查找到。

创建完成后可以看到有bcacheX命名的盘,bcache盘是一个裸设备,可以直接格式化使用。

指定慢速盘查看bcache信息,其中dev.uuid是后端盘符的uuid,cset是前端加速盘的uuid

root@node1:~# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum 6B53E06D649610FF [match] sb.version 1 [backing device] dev.label (empty) dev.uuid d4a72085-d765-4c15-ac33-2f65e3f09dd0 dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.data.first_sector 16 dev.data.cache_mode 0 [writethrough] dev.data.cache_state 1 [clean] cset.uuid d75fef3e-7036-4c5a-97c4-467ce1ea66e6 root@node1:~# blkid |grep sdb /dev/sdb: UUID="d4a72085-d765-4c15-ac33-2f65e3f09dd0" TYPE="bcache"3 Bcache清理

每一块低速盘(HDD)在经过make-bcache后, 都会对应一个bcacheX设备, 删除低速盘就是将对应的bcacheX设备停掉(删掉). 如果该bcacheX设备有绑定前端盘(SSD), 需要先解除与前端盘的关联。

root@node3:~# lsblk |grep sda -A 1 ##确定要删除bcache盘的后端盘 sda 8:0 0 14.6T 0 disk └─bcache0 252:0 0 14.6T 0 disk root@node3:~# bcache-super-show /dev/sda|grep cset ##获取到cset cset.uuid ae6bf031-bd04-47f5-a273-48f2dd514268 root@node3:~# echo "ae6bf031-bd04-47f5-a273-48f2dd514268" > /sys/block/bcache0/bcache/detach ##通过获取到的cset.uuid移除bcache0的绑定 root@node3:~# echo 1 >/sys/fs/bcache/ae6bf031-bd04-47f5-a273-48f2dd514268/unregister root@node3:~# echo 1 > /sys/block/bcache0/bcache/stop4 参数优化

Bcache大部分参数都是开箱即用的,Bcache默认参数能覆盖90%以上的场景,不过有几个参数我们仍然可以进行调整。

echo "writeback" > /sys/block/bcache$i/bcache/cache_mode echo $((1024*1024)) > /sys/block/bcache$i/bcache/sequential_cutoff echo 40 > /sys/block/bcache$i/bcache/writeback_percent

5 Bcache使用建议5.1 内核版本的选择

bcache在3.10版本开始合并到官方内核。在5.4内核版本中逐渐趋于稳定,在5.15和5.19版本中修复了部分问题。因此如果需要使用bcache建议选择这几个内核的最新版本。

5.2 bcache设备盘符变化问题

有多个bcache设备的情况下,在系统重启后,bcache的盘符会发生变化,如bcache0重启后可能变为bcache1或bcache2。因此在创建好bcache设备后,不要直接mount bcache设备,而是应该通过bcache设备格式化后的文件系统uuid来进行mount。

root@node1:~# blkid |grep bcache0 /dev/bcache0: UUID="ed31e3ca-9bec-44bb-aa1a-a2a3ed428cb2" TYPE="xfs"5.3 垃圾回收(gc)对性能的影响

由于Bcache在存储数据和元数据时,均是追加写,因此需要及时进行垃圾回收。将不再使用的存储空间回收后,供后续申请使用。

每写入缓存总容量1/16的数据量后,会触发一次垃圾回收操作。bcache 自身的 gc 操作,会停止前端 io 的下发。可以通过以下方式观察bcache的gc操作

root@node1:~# grep . /sys/block/bcache0/bcache/cache/internal/btree_gc_* /sys/block/bcache0/bcache/cache/internal/btree_gc_average_duration_ms:1762 /sys/block/bcache0/bcache/cache/internal/btree_gc_average_frequency_sec:66602 /sys/block/bcache0/bcache/cache/internal/btree_gc_last_sec:16437 /sys/block/bcache0/bcache/cache/internal/btree_gc_max_duration_ms:3588

5.4 cache的容量设置为多少合适

需要根据具体的业务场景来看,cache内主要存储的是热数据,容量设置为backing设备的10% ~ 20%都是可以的。

5.5 cache容量使用完后对性能的影响

cache容量不会被使用完,因为为了防止出现死锁,bcache限制了脏数据最多只能使用cache 70%的容量。随着容量的使用,对性能的影响有以下几个区别。

writeback线程将启动,将cache设备上的脏数据写入到backing设备,并限制前端的写入速度。回写的带宽由软件模拟的比例微分积分控制器动态控制。脏数据越多,分配给回写线程的带宽越多,则业务IO的的性能会逐步降低。

部分IO请求会跳过缓存直接访问后端设备。这会进一步降低业务IO性能来确保回写线程能够处理更多脏数据。

后续业务IO将不再进入缓存设备,避免过多脏数据导致垃圾回收和空间分配算法死锁。

5.6 cache设备故障如何修复

当cache对应的ssd或nvme设备损坏,且cache设备上还有脏数据未写回到backing设备时。这部分cache上的数据可能会丢失。因此为了保证数据安全,需要业务层具有相应的备份策略,例如ceph的副本策略等。

5.7 bcache的性能是否和cache所用的ssd或nvme性能相当

大家可能会想,既然在writeback模式下,数据是直接写到cache设备中的,那是不是相当于我只要使用bcahe就能获得和ssd或nvme设备相当的性能呢。不是这样的,因为对于I/O请求,bcache都需要更新B tree索引、缓存数据、写journal,可能还需要分裂B tree节点,并且I/O过程中还会受到gc和脏数据写回的影响。因此比起ssd或nvme设备,bcache性能会差一些,但是比起纯HDD设备,也已经足够好了。

6 参考资料

关注公众号 singless,获取更多有价值的文章

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved