bcache

bcachekernel-3.10开始并入mainline。它围绕基于闪存的SSD的独特特性设计,并使用混合btree/log结构来跟踪缓存的区域。它旨在不惜一切代价(at all cost)避免随机写。

通过后端设备(backing device)和缓存设备(caching device)来创建虚拟的bcache 设备,如下图所示:

默认状态下bcache不缓存顺序IO,只缓存随机读写1)。为避免随机写,bcache将随机写转换为顺序写,首先写到SSD,然后回写缓存使用SSD缓存大量的写,最后将写有序写到磁盘或者阵列上。 bcache会检测顺序IO并忽略;还会对每一个任务记录动态的平均IO大小,当平均IO大小超过阈值2)时该任务后面的IO将会被忽略,这样就可以透传备份或者大文件拷贝。

bcache适用于桌面、服务器,高级存储阵列,甚至是嵌入式环境。设计bcache目标是让被缓存设备与SSD一样快(包括缓存命中、缓存不命中、透写和回写)。现在还未达到初衷,特别是顺序写。同时测试结果表明离目标很接近,甚至有些情况下表现更好,例如随机写。

  bcache是数据安全的。对于写回策略缓存来说,可靠性是非常重要的,出错就意味着丢失数据。bcache是用电池备份阵列控制器的替代选择,同时也要求bcache在异常掉电时也是数据安全的。对于写而言,必须在所有数据写到可靠介质之后才能向上层返回写成功。如果在写一个大文件时掉电了,则写入是失败的。异常掉电数据安全是指 cache 中的脏数据是不会丢的,不像内存中的脏数据掉电就没了。

  bcache性能设计目标是等同于SSD.最大程度上去最小化写放大,并避免随机写。bcache将随机写转换为顺序写,首先写到SSD,然后回写缓存使用SSD缓存大量的写,最后将写有序写到磁盘或者阵列上。对于RAID6阵列,随机写性能很差,还要花费不菲的价格购买带有电池保护的阵列控制器。现在有了bcache,你就可以直接使用linux自带的优秀软RAID,甚至可以在更廉价的硬件上获取更高的随机写性能。

  • 一个缓存设备可以作为多个设备的缓存,并且可以在设备运行时动态添加和删除缓存
  • 只有当写到磁盘后缓存才会确认写完成
  • 支持writethrough, writeback和writearound,并且可以在运行时动态改变
  • 高性能的 writeback 实现:脏数据都是排序后再回写。如果设置了 writeback 水位线,PD控制器会根据脏数据比例来平滑处理到后台writeback流量3)
  • 正确处理写阻塞和刷缓存;
  • 脱离devicemapper框架,采用Btree和journal设计,性能高。
  • 虚拟设备名字不能自定义,设备由系统按bcache+minor组成
  • 检测并避开顺序IO(可配置关闭该选项)
  • 可设置顺序IO阈值和检测顺序IO的个数。
  • 可是设置SSD延迟阈值,当超过阈值的时候,就会跳过ssd直接写磁盘。
  • 缓存不命中时预读(默认关闭)
  • 支持LRU, FIFO, RANDOM替换策略,并且可以实时替换;
  • 使用高效率的 B+树,bcache随机读可以达到 1M IOPS;
  • btree动态增长,node数目只增不减,当内存不足,会触发shrinker回收(通过操作/proc/sys/vm/drop_caches触发)。
  • 稳定4)

3.1 bcache 设备种类

  1. backing 设备
    • 指SSD后面的设备,通常是机械盘;
  2. cache 设备
    • 指缓存设备,通常为SSD;
  • 所有设备在使用之前都需要注册;
  • 一个cache设备可以绑定到多个backing设备,但是一个backing设备不可以绑定多个cache设备;

3.2 使用bcache步骤

  1. 创建backing和cache设备;
  2. 注册backing和cache设备;
  3. 绑定backing和cache设备;

3.3 cache模式

  • writethrough : 读缓存
  • [writeback] : 写缓存,中括号表示当前模式;
  • writearound : ?
  • none : ?

3.4 bucket size

  • cache设备(ssd)被格式为多个bucket,每个bucket用来缓存一部分backing设备的block。
  • cache设备将以bucket为最小单位,将数据同步到backing设备,或重用bucket。
  • 使用bucket的好处是减少离散的写操作。

3.5 block size

  • cache设备数据块的大小,应匹配后端设备的 sector size;
  • ssd通常为4K;

1)
A sequential IO will bypass the cache once it passes this threshhold; the most recent 128 IOs are tracked so sequential IO can be detected even when it isn't all done at once.
2)
/sys/block/bcache0/bcache/sequential_cutoff
3)
writeback_percent
4)
dm-cache感觉就不稳定,配置好了就是hit不到4K IO
  • storage/缓存技术/bcache/start.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)