bcache / 如何使用bcache构建LVM,软RAID / 如何优化bcache

本文详细介绍了bcache,一种Linux内核块设备层缓存,用于提升硬盘性能。内容包括bcache的背景知识、术语、安装、设备部署、调优、自启动脚本、性能测试、维护方法,以及如何在软RAID和LVM上使用bcache。文章适合后端开发者和运维人员阅读,帮助理解bcache的工作原理和实践应用。
摘要由CSDN通过智能技术生成

bcache / 如何使用bcache构建LVM,软RAID / 如何优化bcache

作者

digoal

日期

2016-09-19

标签

bcache , mdadm , lvm2 , 软RAID


bcache 背景知识

本小章节转载自 http://www.sysnote.org/2014/06/20/bcache-analysis/

1. 简介
bcache是linux内核块设备层cache,类似于flashcache使用ssd作为hdd的缓存方案,相比于flashcache,bcache更加灵活,支持ssd作为多块hdd的共享缓存,并且还支持多块ssd(还未完善),能够在运行中动态增加,删除缓存设备和后端设备。

从3.10开始,bcache进入内核主线。

bcache支持writeback、writethrough、writearoud三种策略,默认是wriththrough,可以动态修改,缓存替换方式支持lru、fifo和random三种。下面从几个方面介绍bcache的实现机制。

2.总体结构

bcache的整体结构如图所示。

pic1

bcache中是以cache set来划分不同存储集合,一个cache set中包含一个或多个缓存设备(一般是ssd),一个或多个后端设备(一般是hdd)。

bcache对外输出给用户使用的是/dev/bcache这种设备,每个bcache设备都与一个后端物理盘一一对应。

用户对不同bcache设备的io会缓存在ssd中,刷脏数据的时候就会写到各自对应的后端设备上。

因此,bcache扩容很容易,只要注册一个新的物理设备即可。

3. bcache关键结构

3.1 bucket

缓存设备会按照bucket大小划分成很多bucket,bucket的大小最好是设置成与缓存设备ssd的擦除大小一致,一般建议128k~2M+,默认是512k。

每个bucket有个优先级编号(16 bit的priority),每次hit都会增加,然后所有的bucket的优先级编号都会周期性地减少,不常用的会被回收,这个优先级编号主要是用来实现lru替换的。

bucket还有8bit的generation,用来invalidate bucket用的。

bucket内空间是追加分配的,只记录当前分配到哪个偏移了,下一次分配的时候从当前记录位置往后分配。另外在选择bucket来缓存数据时有两个优先原则:

1)优先考虑io连续性,即使io可能来自于不同的生产者;

2)其次考虑相关性,同一个进程产生的数据尽量缓存到相同的bucket里。

3.2 bkey

bucket的管理是使用b+树索引,而b+树节点中的关键结构就是bkey,bkey就是记录缓存设备缓存数据和后端设备数据的映射关系的,其结构如下。

struct bkey {
 uint64_t   high;
 uint64_t   low;
 uint64_t   ptr[];
}

pic2

其中:

  • KEY_INODE:表示一个后端设备的id编号(后端设备在cache set中一般以bdev0,bdev1这种方式出现)
  • KEY_SIZE:表示该bkey所对应缓存数据的大小
  • KEY_DIRTY:表示该块缓存数据是否是脏数据
  • KEY_PTRS:表示cache设备的个数(多个ptr是用来支持多个cache设备的,多个cache设备只对脏数据和元数据做镜像)
  • KEY_OFFSET:bkey所缓存的hdd上的那段数据区域的结束地址
  • PTR_DEV:cache设备
  • PTR_OFFSET:在缓存设备中缓存的数据的起始地址
  • PTR_GEN:对应cache的bucket的迭代数(版本)

3.3 bset

一个bset是一个bkey的数组,在内存中的bset是一段连续的内存,并且以bkey排序的(bkey之间进行比较的时候是先比较KEY_INODE,如果KEY_INODE相同,再比较KEY_OFFSET)。

bset在磁盘上(缓存设备)有很多,但是内存中一个btree node只有4个bset。

4. bcache中的b+树

4.1 btree结构

bcache中以b+tree来维护索引,一个btree node里包含4个bset,每个bset中是排序的bkey。

pic3

图中做了简化,一个btree node只画了两个bset。

每个btree node以一个bkey来标识,该bkey是其子节点中所有bkey中的最大值,不同于标准的b+树那样,父节点存放子节点的地址指针,bcache中的b+树中非叶子节点中存放的bkey用于查找其子节点(并不是存的地址指针),而是根据bkey计算hash,再到hash表中取查找btree node。

叶子节点中的bkey存放的就是实际的映射了(根据这些key可以找到缓存数据以及在hdd上的位置)。

pic4

bkey插入到b+树中的过程与标准的b+树的插入过程类似,这里不做细讲。

pic5

pic6

4.2 btree插入bkey时overlapping的处理

收到新的写io时,这个io对应hdd上的数据可能有部分已经缓存在ssd上了,这个时候为这个io创建的bkey就需要处理这种overlapping的问题。

Btree node 是log structured,磁盘上的btree node有可能有overlap的情况,因为是在不同时候写入的。

但是内存中的btree node不会有overlap,因为插入bkey时如果和内存中的bkey有overlap,就会解决overlap的问题;

另外,从磁盘上读出btree node时就会把bsets中的bkey做归并排序,就会检查overlap的问题并进行解决。

下图给出了一个示例情况。

pic7

出现这种overlapping的情况,原来的bkey会做修改(ssd和hdd上的偏移都会修改,还有数据大小)。

插入key或者查找key时,使用待处理的key的start来遍历bset中的bkey(bset中的bkey排序了),找到可能存在overlapping的第一个key,如下图描述的两种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值