BCache源码浅析之一基本使用与代码模块

BCache源码浅析

 BCache可用于云平台加速磁盘的读写性能;但目前该技术由于较新还不够稳定。不过由于它已经移入到了Linux内核源码中,所以稳定性应会得到不断的提升。本系类文章将尝试分析Linux Kernel/Driver/Md/Bcache的工作原理与架构, 但由于个人能力与时间原因可能存在很多不足; 另一个想法是和大家交流bcache((其中bset部分的一些代码还未理解); 所以这里只能是浅析, 可能有些地方的理解存在错误, 希望能与大家交流讨论。


1.作用与架构

1.1 简介 

  bcache是按照SSD特性来设计的,只按擦除桶大小进行分配,使用b+tree和日志混合方法来跟踪缓存数据,缓存数据可以是桶上的任意一个扇区。bcache最大程度上减少了随机写的代价,它按顺序填充一个桶,重新使用时只需将桶设置为无效。bcache支持写直达和回写策略。回写默认情况下是关闭的,可以在运行时改变。bcache还在最大程度上保护你的数据,在系统异常关机时数据仍然是可靠的。因为它被设计为只有在数据完全写回存储设备才确认写成功。回写策略能够缓存绝大多数的写请求,然后再按照索引将脏数据按次序写回到后端存储设备。SSD的特点就是随机IO速度很快,而对于大块顺序IO的提升却并不大。bcache会检测顺序IO并忽略;还会对每一个任务记录动态的平均IO大小,当平均IO大小超过截止值时该任务后面的IO将会被忽略,这样就可以透传备份或者大文件拷贝。

在flash上发现数据IO错误时,首先会尝试读以恢复数据或者将该缓存项置为无效。对于不可恢复的错误,例如元数据或脏数据,bcache将会自动关闭缓存。如果有脏数据在缓存中,这时会首先关闭回写策略然后再等待脏数据刷回。

 

1.2  基本使用:

1.编译安装
# git clone http://evilpiepirate.org/git/bcache-tools.git
安装前需要两个依赖包pkg-config和libblkid-dev
# apt-get install pkg-config libblkid-dev
然后编译
# make
# make install

2.使用方式
2.1 创建bcache设备
命令:make-bcache -C [cache-device] -B [backing-device]
以vde作为缓存盘,vdb和vdc作为后端设备创建bcache设备,有几个后端设备就会生成几个bcache设备。

# make-bcache -C /dev/vde -B /dev/vdb /dev/vdc
UUID: 8941a5d1-074e-4cc6-a6dd-56cb1f65aed3
Set UUID: 7681dbb3-6558-4e60-b062-5fbb648f6665
version: 0
nbuckets: 20480
block_size: 1
bucket_size: 1024
nr_in_set: 1
nr_this_dev: 0
first_bucket: 1
UUID: 9e28d09b-942d-487e-be22-9132063da572
Set UUID: 7681dbb3-6558-4e60-b062-5fbb648f6665
version: 1
block_size: 1
data_offset: 16
UUID: 1bacf83e-2754-4d6a-a964-09e53e6e679f
Set UUID: 7681dbb3-6558-4e60-b062-5fbb648f6665
version: 1
block_size: 1
data_offset: 16
# ls /dev/bcache* -la
brw-rw—T 1 root disk 250, 0 5月22 17:23 /dev/bcache0
brw-rw—T 1 root disk 250, 1 5月22 17:23 /dev/bcache1

然后可以使用lsblk查看这些设备的对应关系
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
vdb 254:16 0 50G 0 disk
└─bcache1 250:1 0 50G 0 disk
vdc 254:32 0 50G 0 disk
└─bcache0 250:0 0 50G 0 disk
vdd 254:48 0 50G 0 disk
└─bcache2 250:2 0 50G 0 disk
vde 254:64 0 10G 0 disk
├─bcache0 250:0 0 50G 0 disk
└─bcache1 250:1 0 50G 0 disk

2.2 添加一块后端设备(backing device)
命令:make-bcache -B [backing-device]

# make-bcache -B /dev/vdh
UUID: bd1bc116-6f39-401e-a328-3bc0af4ac8d1
Set UUID: cd86812e-d24c-46da-b949-683969b59575
version: 1
block_size: 1
data_offset: 16
接着看到对应的设备是/dev/bcache3

查看cache set uuid
# ls -la /sys/fs/bcache/
total 0
drwxr-xr-x 3 root root 0 May 22 17:23 .
drwxr-xr-x 6 root root 0 May 22 17:21 ..
drwxr-xr-x 7 root root 0 May 22 17:26 7681dbb3-6558-4e60-b062-5fbb648f6665
–w——- 1 root root 4096 May 2217:57 register
–w——- 1 root root 4096 May 2220:44 register_quiet

“attach”后端设备
命令:echo [cache set uuid] >/sys/block/bcache[N]/bcache/attach
attach之后,缓存设备就能够对新加的后端设备缓存数据了。
# echo 7681dbb3-6558-4e60-b062-5fbb648f6665 >/sys/block/bcache3/bcache/attach


2.3 删除一块后端设备
1)detach backing device
命令:echo [cache set uuid] >/sys/block/bcache[N]/bcache/detach
detach后端设备后,对应的bcache设备还是存在的,只不过这个bcache设备是无缓存的,查看其状态可以看到是no cache

比如删除bcache3
# echo 7681dbb3-6558-4e60-b062-5fbb648f6665 >/sys/block/bcache3/bcache/detach
# cat /sys/block/bcache3/bcache/state
no cache

2)stop backing device
命令:echo 1 > /sys/block/bcache[N]/bcache/stop
detach后端设备后,对应的bcache设备还存在,如果要删除,还需要stop该设备
# echo 1 > /sys/block/bcache3/bcache/stop
# ls /dev/bcache* -la
brw-rw—T 1 root disk 250, 0 May 22 17:51 /dev/bcache0
brw-rw—T 1 root disk 250, 1 May 22 17:54 /dev/bcache1
brw-rw—T 1 root disk 250, 2 May 22 20:42 /dev/bcache2


2.4 新增一块缓存设备(caching device)
1)创建cache设备
命令:make-bcache -C [cache device]
有可能对应的设备已经有一些元数据,需要使用wipefs清理掉

# make-bcache -C /dev/vdf
Device /dev/vdf already has a non-bcache superblock, remove it using wipefs andwipefs -a
# wipefs -a /dev/vdf
4 bytes were erased at offset 0x27fff0000 (linux_raid_member)
they were: fc 4e 2b a9
# make-bcache -C /dev/vdf
UUID: 1f8bc71f-0106-4da5-b781-5de7b1517706
Set UUID: 7bfb0d17-b6d0-4fe9-942b-a1c75a0893ab
version: 0
nbuckets: 20480
block_size: 1
bucket_size: 1024
nr_in_set: 1
nr_this_dev: 0
first_bucket: 1


2)与bcache设备关联
命令:echo [cache set uuid] >/sys/block/bcache[N]/bcache/attach
缓存设备需要与bcache设备关联后,才能作为对应bcache设备缓存。

# echo 7bfb0d17-b6d0-4fe9-942b-a1c75a0893ab >/sys/block/bcache3/bcache/attach

2.5 删除cache设备
首先确保没有backing device在使用它,上述的“删除一块后端设备”有说明如何设置取消后端设备对缓存设备的使用。
然后可以使用lsblk来查看是否有盘在引用它。
在在/sys/fs/bcache目录下还有对应的cacheset uuid,unregister该set uuid后这个cache设备就被视为删除了。
命令:echo 1 > /sys/fs/bcache/[cache setuuid]/unregister

比如vde已经不作为任何设备的缓存盘了,在/sys/fs/bcache目录下有对应的cache set uuid
# ls /sys/fs/bcache/ -la
total 0
drwxr-xr-x 4 root root 0 5月 26 09:07 .
drwxr-xr-x 6 root root 0 5月 26 09:06 ..
drwxr-xr-x 7 root root 0 5月 26 09:077681dbb3-6558-4e60-b062-5fbb648f6665
drwxr-xr-x 7 root root 0 5月 26 09:077bfb0d17-b6d0-4fe9-942b-a1c75a0893ab
–w——- 1 root root 4096 5月 26 09:07 register

        

1.3 源码模块与接口说明

文件

作用

重要接口函数

函数说明

注释

Super.c

驱动注册 与bache初始化

bcache_init

bcache_exit

驱动注册与卸载

 

register_bcache

Make-bcache的内核态实现

Bcache_init调用sysfs_create_files(bcache_kobj, files)注册

register_bdev

注册对block层的设备,该设备作为最终的/dev/bcache

 

register_cache

注册缓存设备

 

Request.c

实现对block层的访问接口

cached_dev_make_request

处理block层的request

Bcache_init==>

bch_cached_dev_request_init

cached_dev_write

cached_dev_read

处理设备的读写

 

Sysfs.c

对用户层的sys文件接口

bch_cached_dev_files

bch_cache_set_files

bch_cache_files

 

 

Closure.c

Closure用于维护对象的引用计数和回调完成

 

 

该模块为底层机制

Stats.c

 

包含一个timer用于时间统计

用于参数统计

 

Util.c

 

1. CRC

2.uuid

3. bch_bio_map

4.字符串处理

辅助函数

 

Util.h

 

Heap,

Fifo,

array

封装了这3种数据结构

 

Alloc.c

Bucket的分配与回收管理

bch_bucket_alloc

bch_allocator_thread

桶分配,当剩余量不足时启动线程来分配

 

bch_bucket_free

回收桶,但不直接回收而是标记为GCGC统一回收

 

bch_alloc_sectors

bkey分配新的桶,并更新bkey相关字段

 

Beset.c

Bkey的集合管理

bch_btree_iter_init

bch_btree_iter_next

bch_btree_iter_next_filte

Btreez结构中的bkey集合的访问迭代器

该模块实现了t->tree binary search点相关代码目前还没读懂

bch_btree_sort_partial

Btreez结构中的bkey的排序

Extents.c

btreekey的访问

bch_extent_keys_ops

页节点操作集合

mca_alloc中赋值,操作包含合法性判断,合并与排序

bch_btree_keys_ops

非页节点操作结合

Io.c

对缓存设备与主设备的操作封装

Bch_bio 开头函数操作主设备

Bch_bbio开头操作cache设备

 

该模块为底层机制,建立在bio机制上

Movinggc.c

Bucket回收管理

bch_moving_gc

根据bucket的标志位做实际回收

 

Writeback.c

缓存写回机制

bch_cached_dev_writeback_init

初始化, super.c调用

 

bch_writeback_thread

Writeback线程

 

 

 

bcache_dev_sectors_dirty_add

标记缓存设备的sectordirty

Extents调用该函数

Btree.c

Btree的建立,插入与替换操作,以及btree的垃圾标记

btree_gc_开头函数为gc相关

 

bch_gc_threadgc线程

bch_btree_insert_check_key

bch_btree_insert

节点插入操作

没有直接的 delete操作,通过replace来实现key的替换

bch_btree_node_alloc

bch_btree_set_root

btree_node_free

Btree节点的分配与回收

 

bch_btree_map_keys

bkey查找,并执行响应操作

 

Journal.c

btree页节点的操作做 journal管理用于减少插入时的非顺序读写

bch_journal

btree添加时,调用该函数建立journal

 

bch_journal_replay

下次打开时对未处理的btree insert做重新提交操作

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在对Node-RED源代码中的editor-api模块进行分析前,我们需要了解Node-RED是一个基于Node.js的流程编程工具,通过编写流程来实现不同设备之间的连接和通讯。editor-api模块是Node-RED的一个子模块,负责提供与流程编辑器相关的API接口。 首先,editor-api模块代码位于Node-RED的`red/runtime/editor-api.js`文件中。该模块主要提供了一些用于流程编辑器的API接口,包括获取和更新流程信息、节点信息、连接信息等等。 在代码中,首先定义了一个`EditorAPI`类,该类通过`RED`对象的`comms`模块来工作。`comms`模块用于处理流程编辑器的通信和发送消息。 接着,在`EditorAPI`类中定义了一系列的方法,用来对流程、节点和连接等信息进行操作。其中一些重要的方法包括: - `getFlows`:用于获取当前所有流程的信息。 - `getFlow`:根据流程ID获取特定流程的信息。 - `getFlowTab`:根据流程ID获取对应的流程tab,用于在编辑器中显示和操作流程。 - `updateFlow`:用于更新特定流程的信息。 - `getNode`:根据节点ID获取节点的信息。 - `addNode`:用于在流程中添加新的节点。 - `getConnections`:获取当前所有节点的连接信息。 通过这些方法,开发者可以方便地对流程进行增加、删除、修改等操作,并在编辑器中进行实时的反馈。 此外,还有一些与编辑器的交互相关的方法,比如`selectTab`方法用于切换当前编辑的流程tab,`resize`方法用于调整编辑器的大小等。 总的来说,editor-api模块代码分析主要围绕着提供与流程编辑器相关的API接口展开,给开发者提供了一种方便灵活的方式来操作和管理流程及其相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值