Ftrace训练营火热报名中:Ftrace训练营:站在设计者的角度来理解ftrace(限50人)。训练营第一期报名已圆满成功,好评如潮。第二期课程正在进行中,第三期报名正在火爆进行中(咨询小月微信:linuxer2016)。
ARM安全架构训练营2期火热报名中:阅码场训练营:ARM安全架构之Trustzone-TEE实战。报名咨询客服(小月微信:linuxer2016)。
ARM架构与调优调试训练营火热报名中:阅码场训练营:ARM架构与调试调优。报名咨询客服(小月微信:linuxer2016)。
作者简介
李勇:现就职于SUSE LABS存储组,是长期活跃的Linux Kernel的开发者,是Linux Kernel主线的bcache子系统的维护者,先后就职于联想、阿里并从事内核和存储相关研发工作。
傅治宇:现在就职于联想,主要从事Ceph以及分布式存储相关架构与研发工作。
bcache是linux内核块设备层的一个软件驱动。其作用是使用高速的存储设备为传统的机械硬盘或者低速设备做的缓存,主要缓存热数据。
bcache首次合并到linux内核版本是3.10内核。其作者是Kent Overstreet,其同时也编写了bcachefs。bcache在linux内核5.4以以后趋于稳定,linux内核5.19也修改部分问题。推荐使用bcache使用linux内核5.19。
(1)Bcache设备: 应用程序直接访问读写的虚拟块设备
(2)Cache设备: 存储热数据的高速设备
(3)Backing设备: 传统机械硬盘或低速设备
来自:哔哩哔哩的Bcache子系统概况:基本功能、设计原理和数据结构
(1)Writeback(回写策略):此策略模式下,则所有的数据将先写入缓存盘,然后等待系统将数据回写到后端数据盘中。
(2)Writethrough(写通策略):此策略模式下,数据同时写入缓存盘和后端数据盘,适用于读多写少的场景
(3)Writearound(旁路策略):选择此策略,数据将直接写入后端磁盘。
bcache的默认参数配置,能够覆盖90%的场景即bcache开箱即用,相关参数无需进行优化。
(1)数据索引:用于记录哪些数据被缓存哪些数据没有被缓存,其数据结构采用B+树。其大小是最小是512字节。对于的代码级数据结构叫bkey,该结构存在内存中。bkey的插入与删除是写入journal,而非直接持久化到高速缓存设备上面。
(2)使用journal用于进行掉电保护数据一致性。journal不支持回滚。journal在回写的时候,出现空间不足,会造成死锁。此问题在linux5.19内核存在,linux内核5.19修改。
bcache采用追加写的方式写入高速设备,提高半导体存储介质寿命
bcache脏数据是指缓存到Cache设备上面,没有写入Backing设备的数据
一个IO结束是bkey写入journal即结束。
(1) 垃圾回收触发机制: 写入量是缓存总容量的1/16,就会触发一次垃圾回收。此处的缓存认为应该cache设备。
(2) 垃圾回收扫描整个B+树的bkey所引用的存储桶来进行的。
(3) 垃圾回收主要是回收bkey
(4) 回收的btree bucket会被放到free list
(5) 脏数据被写到backing设备后,才能被垃圾回收回收掉
(1) 脏数据回写由回写线程负责
(2) 回写线程的优先级随着脏数据的数量增多,优先级也会越来越高。会影响业务IO,使业务IO变慢,为回写线程让出带宽,保证回写线程先完成回写,否则会导致cache设备满了,垃圾回收无法回收到空闲空间,最终会导致bcache出现死锁问题。
(3) 回写带宽是动态调整的,主要通过软件模拟的PID(比例微分积分)控制器,动态根据写入脏数据的量和新产生的脏数据的量作为PID控制器的输入来定义回写带宽。主要原理是通过控制回写线程的时间间隔来实现的。回写线程不休眠,一直工作,被认为回写带宽是最高的。
(4) 回写线程回写会对B+树加锁
精华文章:【精华】Linux阅码场原创精华文章汇总