Bcache详解及踩坑记录

news/2025/10/29 14:27:54/文章来源:https://www.cnblogs.com/singless233/p/19174323

关注公众号 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的缓存模式

  • writethrough (直写策略): 数据写入时, 必须SSD和HDD盘都写入成功, 写入请求才算完成, 写入请求才返回. 因此对于写入, 该策略并未有性能提升. 适用于读多写少的场景, 可以保证数据的强一致性
  • writeback (回写策略): 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景
  • writearound (绕写 策略): 数据写入时, 绕过SSD, 直接写入到HDD盘中. 可以防止SSD因写I/O而填满, 导致以后不可重新读取. 缺点是: 当数据第一次读取, 由于写入时绕过了SSD, 因此会有SSD从HDD加载数据的操作
  • none: 读写操作都不会涉及到缓存盘, 将直接与后端磁盘交互。

 

查看缓存模式

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

 

bcache的缓存状态

  • no cache: 这代表你还没有绑定缓存设备到你的后端设备上
  • clean: 这代表一切正常,缓存是clean的
  • dirty: 这代表一切正常,缓存模式被设置成了writeback,缓存是dirty的
  • inconsistent: 这代表问题很大,后端设备与缓存设备没有同步使用一个没有缓存设备的 /dev/bcache0 的话所有的IO都会直接在后端设备上执行,等于pass-through模式。
root@node2:~# cat /sys/block/bcache0/bcache/state
clean

 

2 创建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

  • 如果udev规则没有安装,则需要手动注册设备
root@ceph-1:~# echo /dev/nvme0n1 > /sys/fs/bcache/registerroot@ceph-1:~# echo /dev/sdb > /sys/fs/bcache/register

 

  • 如果udev规则没有安装,还需要手动将cache设备挂载到backing设备上,否则高速缓存不会介入。
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-467ce1ea66e6root@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/stop

 

4 参数优化

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
  • cache_mode,设置BCache设备的缓存模式为"writeback"
  • 设置BCache设备的顺序截断(sequential cutoff)。顺序截断是指当连续IO操作的大小超过该阈值时,BCache会将这些IO操作视为顺序访问,而不会缓存到缓存中。这有助于避免将大量连续IO操作缓存到BCache中,保持缓存的有效性。这里的1024*1024表示1MB。
  • 设置BCache设备的写回百分比(writeback percent)。写回百分比表示当缓存容量占用达到一定百分比时,BCache会开始执行写回操作。

 

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
  • btree_gc_average_duration_ms(平均持续时间):
    • 较小的值表示平均每次垃圾收集操作的执行速度较快。
    • 这个值表示每次B树垃圾收集操作的平均持续时间,单位是毫秒(ms)。
  • btree_gc_average_frequency_sec(平均频率):
    • 较小的值表示平均垃圾收集操作执行的频率较低,系统压力较小。
    • 这个值表示B树垃圾收集操作的平均执行频率,单位是秒(sec)。
  • btree_gc_last_sec(最近一次垃圾收集操作的持续时间):
    • 它提供了最近一次垃圾收集操作的执行效率。
    • 这个值表示最近一次B树垃圾收集操作的持续时间,单位是秒(sec)。
  • btree_gc_max_duration_ms(最大持续时间):
    • 较小的值表示没有出现非常耗时的垃圾收集操作。
    • 这个值表示所有垃圾收集操作中的最大持续时间,单位是毫秒(ms)。

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

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

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

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

  • 当脏数据达到writeback_percent设置的值时

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

  • 当脏数据超过缓存设备容量40%时

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

  • 当脏数据容量超过缓存容量70%时

后续业务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 参考资料

  • [1] 
  • [2] 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDD介质OSD新增SSD或NVME类型的DB或WAL分区

关注公众号singless,后台回复ceph可以获取文中相关脚本。 1 介绍 在ceph中,BlueStore使用RocksDB key-value数据库来管理内部元数据,比如从对象名称到磁盘上块位置的映射。一个对象的元数据在bluestore内称为Onode。…

什么是跨网域资源共享(CROS)

1 同源策略 浏览器的同源策略 - Web 安全 | MDNdeveloper.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy 同源策略是一种重要的安全机制,它限制一个源加载的文档或脚本如何与另一个源的资源进行交互。同源…

【生活】选购油烟机

前言: 主包家里的厨房在六楼,油烟可以直接从墙上预留通风口排出,所以以下内容是按主包的实际需求出发的性价比公式风量(\(m^3 / min\)):也就是吸力,经常爆炒的至少 20 \(m^3 / min\) 最好 静压(\(Pa\)):也就…

从经验到数据:MyEMS 如何推动能源管理的范式升级?

在 “双碳” 目标深化推进与能源结构转型加速的背景下,能源管理已从传统的 “降本降耗” 单一诉求,升级为 “效率提升、低碳转型、安全保障” 三位一体的核心需求。然而,长期以来,我国工业、建筑、园区等领域的能源…

2025 年试压泵厂家最新推荐榜,技术实力与市场口碑深度解析,展现国产设备卓越性能四缸电动/三缸电动/水管/大流量电动/柴油动力试压泵公司推荐

引言 为精准筛选出 2025 年试压泵领域兼具技术实力与市场认可度的优质品牌,通用机械工业协会泵业分会联合行业权威检测机构,开展了为期 3 个月的专项测评。测评采用 “多维量化 + 实地考察” 双轨模式,从企业综合实…

Ceph运维手册(基于P版本)

本文基于Ceph P版,适用于ceph-deploy部署非容器化部署场景。 完整版PDF下载链接请点击以下链接 https://mp.weixin.qq.com/s/57zn-a4zZ4Dc2mBhsa23PQ 修订记录版本 时间 修订人V1.0 2024年03月06号 singless目录 一、…

2025最新AI智能体学习路线图

零基础如何入门AI智能体?智能体来了为你梳理完整学习路径。 🧠智能体来了课程主体线路下图描绘了智能体学习的整体思路,细节内容颇多,今天给各位看官讲解部分,关注博主,详细细节后续会持续更新。大纲打造旨在解…

K8S如何查询PVC的已用容量和剩余可用容量

在业务中如果有数据持久化存储的需求就免不了要使用到PV、PVC,既然使用了PV和PVC那么它们的容量使用情况也是我们需要关注的。目前K8S并未提供接口让我们可以直接查询到PVC的容量使用情况,因此本文主要介绍K8S环境下…

学术会议会议合集 | 人工智能、未来教育 、智能控制 、计算科学 、传感器技术等EI会议合集

人工智能、未来教育 、智能控制 、计算科学 、传感器技术等EI会议合集2025年第二届人工智能与未来教育国际学术会议(AIFE 2025) 2025 2nd International Conference on Artificial Intelligence and Future Educatio…

完整教程:金融分析师技能提升路径与学习资源指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年水磨石厂家最新推荐榜,技术实力与市场口碑深度解析水磨石预制板/人造水磨石/水磨石地砖/水磨石成品地砖/彩色水磨石地砖公司推荐

随着无机水磨石、预制板等细分品类需求激增,市场品牌分化加剧。为破解采购难题,本次榜单依托建筑材料流通协会地坪委员会 2025 年度测评数据,采用 "四维评估体系":生产实力(占比 30%)涵盖厂房规模与自…

Unreal:如何调用DLL

说说我的方法吧,不知道正不正确,但是能用,哈哈哈哈,跟着官方的第三方库弄的打包dll那一套我就不赘述了,就说说拿到DLL和Lib怎么办 以官方模板创建得插件TestThird为例 将dll,lib文件放到TestThird\Source\ThirdP…

建筑矿山设备工厂:MyEMS 如何助力实现 30% 能源自给率与 ISO 50001 认证?

建筑矿山设备工厂作为典型的高能耗制造场景,其生产流程涉及大型机床加工、热处理、焊接、装配等环节,对电力、热力、燃料的需求旺盛。近年来,在 “双碳” 目标与能源成本上涨的双重压力下,工厂不仅需要降低对传统化…

lldpd介绍

1 介绍 lldpd是IEEE802.1AB (LLDP)协议的一种实现。目标是帮助定位所有设备的邻居设备。例如可以定位服务器某个网卡是接在交换机的哪个接口上。要使用该协议交换机上需要启用lldp协议,linux服务器上需要安装lldp相…

HarmonyOS6纯血鸿蒙开发

一、HarmonyOS 开发准备 1.成为华为开发者 在开始应用开发前,需要先完成以下准备工作。在华为开发者联盟网站上,注册成为开发者,并完成实名认证,从而享受联盟开放的各类能力和服务。 1.1 注册账号 如果您已经有华为…

2025年10月短视频营销公司实力榜:五强对比评测与选择指南

一、引言 短视频流量红利进入精细化运营阶段,企业主、市场总监、增长负责人普遍面临“投流贵、内容倦、转化弱”的三重夹击。对创业者而言,能否以可控成本跑通短视频获客闭环,直接决定现金流健康;对成熟品牌而言,…

kettle调度系统-kettle嵌入集成方式调度,稳如磐石,一分钟完成任务调度配置

这款调度产品,早在N年前已经横扫江湖,后来隐退于kettler人间,不少大佬已经在生产环境使用这款产品,今天将重出江湖,造福kettler,咱们正式叫它【kettle金刚调度系统】,江湖名xxkg-pdi。废话少说,亮剑!!! 本款…

探索 RoCE v2:高性能网络技术在 AI 场景中的应用

1. RDMA介绍 1.1 什么是RDMA RDMA(Remote Direct Memory Access),全称远端内存直接访问技术,可以在使用极少CPU资源的情况下,将数据从一台服务器传输至另一台服务器。 在数据中心内部,大型分布式计算存储资源之间,…

K8S下的GPU监控

1 DCGM介绍 在前面给大家介绍了K8S环境下如何调度GPU,在显卡的实际应用中,监控是不可缺少的一环。通过监控,我们能更直观的了解到显卡的使用情况和各项监控指标。英伟达提供了DCGM (NVIDIA Data Center GPU Manager…

Unreal:多屏幕全屏后只有一个屏幕显示怎么办

这里讨论的是,多个屏幕时,用N卡的Surround融合为一个屏幕,当开始游戏后发生的问题 原因 这里的代码截图是Unreal5.3.2版本当全屏时,会获得一个最大分辨率,这个分辨率是你主屏幕的分辨率,即使是通过Surround融合成…