站长之家用户 - 传媒 2022-05-13 11:09

智汇华云 | bcache原理及实践

一、前言

简单介绍下bcache,bcache是linux内核块设备层的cache。主要是使用SSD盘在IO速度较慢的HDD盘上面做一层缓存,从而来提高HDD盘的IO速率。一个缓存设备(SSD)可以同时为多个后端设备(HDD)提供缓存。既然是缓存,那自然就会想到缓存策略,bcache支持三种缓存策略:

writeback:回写策略,所有的数据将先写入缓存盘,然后等待系统将数据回写入后端数据盘中。

writethrough:直写策略(默认策略),数据将会同时写入缓存盘和后端数据盘。

writearoud:数据将直接写入后端磁盘。

Write-misses写缺失(写入的数据不在缓存中)有两种处理方式:

Write allocate方式将写入位置读入缓存,然后采用write-hit(缓存命中写入)操作。写缺失操作与读缺失操作类似。

No-write allocate方式并不将写入位置读入缓存,而是直接将数据写入存储。这种方式下,只有读操作会被缓存。

无论是Write-through还是Write-back都可以使用写缺失的两种方式之一。只是通常Write-back采用Write allocate方式,而Write-through采用No-write allocate方式;因为多次写入同一缓存时,Write allocate配合Write-back可以提升性能;而对于Write-through则没有帮助。

处理流程图:

A Write-Through cache with No-Write Allocation:

A Write-Back cache with Write Allocation:

bcache比较灵活,缓存策略可以随时修改,也可以针对不同的bcache设备设置不同的缓存策略。以下会按照安装、配置和使用这几个部分来说明具体使用bcache的过程。bcache可以大概分为两个部分,一个是linux内核模块,一个是bcache-tools,bcache内核模块在linux内核3.10及以上才支持,所以使用bcache,需要将内核升级到3.10及以上版本才行

二、几种缓存模式

下面简单介绍下三种模式的区别:

Write-through 同时写入到SSD和HDD,并在SSD和HDD都写成功后再返回成功。 Write-back 先写入到SSD,并返回成功,之后再后台同步到HDD。会带来一些稳定性风险。 Write-around 直接写入到HDD。 具体选择哪种模式,取决于业务对磁盘的使用方式。

以下是几种常见的决策方式:

如果对稳定性要求不高,但是对性能比较敏感,则应选择 Write-back,因其性能最高。 如果对稳定性有要求,则: 若是预期刚写入的数据会被较快重新读,则应使用Write-through,它在写入数据的同时,会在SSD上建立读缓存,后续读的时候速度会比较快。 若是很少读之前写入的数据,则应使用Write-around,一方面能加快写入速度(只用写一份),另一方面也避免了无效数据冲刷缓存。

官网说bcache的性能完全优于flashcache,参考:

https://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/

官网介绍:

https://wiki.archlinux.org/index.php/Bcache

https://bcache.evilpiepirate.org/

bcache-tools 源码:

https://evilpiepirate.org/git/bcache-tools.git

(一)、升级内核

1、官网下载内核

https://cdn.kernel.org/pub/linux/kernel/

注意:编译前修改.config文件开启CONFIG_BCACHE

CONFIG_BCACHE=y

2、编译内核

过程忽略

3、安装内核

# rpm  -ivh   kernel-4.18.20-1.x86_64.rpm --force

4、生成grub

# grub2-set-default  0&& grub2-mkconfig -o /etc/grub2.cfg

5、重启

# reboot

6、加载内核

# modprobe bcache

# lsmod | grep bcache

(二)、安装bcache-tools

1、安装依赖libblkid-devel和gcc

# yum install libblkid-devel gcc -y

2、下载bcache-tools源码 下载链接为

https://github.com/g2p/bcache-tools/releases。

3、解压包

# tar -zxvf bcache-tools-1.0.8.tar.gz

# cd /root/bcache-tools-1.0.8

4、安装

# make

# make install

注意:如果是ubuntu环境可以直接安装

# apt-get install bcache-tools

(三)、创建bcache设备

1、创建后端低速设备(一般是HDD、SATA盘等)

# make-bcache -B /dev/sdc

UUID:1eca911e-c9c9-4d9b-84c0-c1da023574ed

Set UUID:5cf29253-f347-435e-a3db-b99006c8e6e0

version:1

block_size:1

data_offset:16

可以看到,在sdb(HDD)磁盘下,出现了bcache0节点,这个bcache0可以理解为就是/dev/sdb磁盘了

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

└─bcache0     252:0   0 200G  0disk

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

对bcache0进行格式化操作了。

# mkfs.xfs /dev/bcache0

meta-data=/dev/bcache0          isize=256   agcount=4, agsize=1310720blks

=                       sectsz=512  attr=2, projid32bit=1

=                       crc=0       finobt=0

data     =                       bsize=4096  blocks=5242878, imaxpct=25

=                       sunit=0     swidth=0blks

naming   =version2             bsize=4096  ascii-ci=0ftype=0

log      =internal log           bsize=4096  blocks=2560, version=2

=                       sectsz=512  sunit=0blks, lazy-count=1

realtime =none                   extsz=4096  blocks=0, rtextents=0

挂载目录

# mkdir /wyl

# mount /dev/bcache0/wyl

# df -h

Filesystem               Size  Used Avail Use% Mounted on

devtmpfs                2.0G    0 2.0G  0% /dev

tmpfs                    2.0G    0 2.0G  0% /dev/shm

tmpfs                    2.0G  8.6M  2.0G  1% /run

tmpfs                    2.0G    0 2.0G  0% /sys/fs/cgroup

/dev/mapper/centos-root  18G  1.6G  16G  9% /

/dev/sda1               497M  170M  328M  35% /boot

tmpfs                    394M    0 394M  0% /run/user/0

/dev/bcache0             20G  33M  20G  1% /wyl

2、创建前端缓存磁盘(SSD)

#  make-bcache -C /dev/sdb

UUID:51d3daf3-ca90-4bf7-9499-79b98321c43a

Set UUID:f43c7118-4595-49cf-a17c-1965ee939b4b

version:0

nbuckets:163840

block_size:1

bucket_size:1024

nr_in_set:1

nr_this_dev:0

first_bucket:1

建立映射关系 把我们创建好的后端低速设备和前端高速设备建立联系,这样高速设备才能为低速设备提供缓存作用。

首先需要获取该缓存盘(/dev/sdb)的cset.uuid,通过bcache-super-show命令查看:

# bcache-super-show /dev/sdb

sb.magicok

sb.first_sector8[match]

sb.csumAD0668369D7EED63[match]

sb.version3[cache device]

dev.label(empty)

dev.uuid51d3daf3-ca90-4bf7-9499-79b98321c43a

dev.sectors_per_block1

dev.sectors_per_bucket1024

dev.cache.first_sector1024

dev.cache.cache_sectors167771136

dev.cache.total_sectors167772160

dev.cache.orderedyes

dev.cache.discardno

dev.cache.pos0

dev.cache.replacement0[lru]

cset.uuidf43c7118-4595-49cf-a17c-1965ee939b4b

备建立联

# echo "f43c7118-4595-49cf-a17c-1965ee939b4b" > /sys/block/bcache0/bcache/attach

操作完成后,可以通过lsblk命令查看结果

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

└─bcache0     252:0   0 200G  0disk /wyl

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

└─bcache0     252:0   0 200G  0disk /wyl

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

三、快速配置方式

上面我们配置大概分了三个步骤:创建后端设备、创建前端缓存设备、建立他们之间的映射关系。

1、快速创建

# make-bcache -C /dev/sdb -B /dev/sdc

2、查看

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

└─bcache0     252:0   0 200G  0disk /wyl

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

└─bcache0     252:0   0 200G  0disk /wyl

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

3、同样支持多个后端设备

# make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd

四、高级功能

1、指定块大小 在make-bcache的时候加入-w和-b参数,主要是提高缓存性能

-w block size 默认2K,一般需要block size = 后端设备的扇区大小。

-b bucket size,一般需要bucket size = 前端缓存设备的erase block size大小。

2、修改缓存策略 查看缓存策略,可以看到默认的策略是writethrough,也就是直写模式

# cat /sys/block/bcache0/bcache/cache_mode

[writethrough] writeback writearound none

修改缓存策略

# echo writeback > /sys/block/bcache0/bcache/cache_mode

然后查看是否生效

# cat /sys/block/bcache0/bcache/cache_mode

writethrough [writeback] writearound none

注:就算机器重启之后缓存策略也不会失效的。

3、查看缓存 确认所有的东西都已经正确地配置了:

# cat /sys/block/bcache0/bcache/state

输出的内容有以下可能:

no cache: 这代表你还没有绑定缓存设备到你的后端设备上

clean: 这代表一切正常,缓存是clean的

dirty: 这代表一切正常,缓存模式被设置成了writeback,缓存是dirty的

inconsistent: 这代表问题很大,后端设备与缓存设备没有同步使用一个没有缓存设备的 /dev/bcache0的话所有的IO都会直接在后端设备上执行,等于pass-through模式。

4.IO路径跟踪

bcache会跟踪每个IO,如果IO的时间超过阈值,则旁路cache设备,直接读写backing设备。

如果你的SSD足够强大,可以不跟踪,减少跟踪的开销。

# echo0> /sys/fs/bcache//congested_read_threshold_us

# echo0> /sys/fs/bcache//congested_write_threshold_us

关闭旁路的另一个好处是,所有的离散读写都会经过cache设备,从而不会导致cache missing。

默认情况下当读请求超过2ms,写请求超过20ms时,旁路cache设备。

The default is2000us (2milliseconds) for reads, and 20000 for writes.

5.将顺序IO也命中到cache中 打开顺序IO缓存:

# echo0> /sys/block/bcache0/bcache/sequential_cutoff

设置回默认值:

# echo4194304  > /sys/block/bcache0/bcache/sequential_cutoff

五、删除bcache

1、解除缓存盘和后端盘关系

要将缓存盘从当前的后端磁盘删除,只需将缓存盘的cset.uuid detach到bcache设备即可实现

查看ssd的cset.uuid

# bcache-super-show /dev/sdb | grep cset.uuid

cset.uuidf43c7118-4595-49cf-a17c-1965ee939b4b

解除绑定

# echo f43c7118-4595-49cf-a17c-1965ee939b4b > /sys/block/bcache0/bcache/detach

查看结果

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

└─bcache0     252:0   0 200G  0disk

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

可以看到sdb下面已经没有bcache0了。

2、删除后端盘

# umount /wyl/

# echo1> /sys/block/bcache0/bcache/stop

# echo1>/sys/fs/bcache/f43c7118-4595-49cf-a17c-1965ee939b4b/unregister

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

└─bcache0     252:0   0 200G  0disk

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

3、验证

# lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sdb              8:16 0 80G  0disk

sr0             11:0   11024M  0rom

fd0             2:0   1   4K  0disk

sdc              8:32 0 200G  0disk

sda              8:0   0 80G  0disk

├─sda2           8:2   0 79G  0part

│ ├─centos-swap253:1   0   4G  0lvm  [SWAP]

│ └─centos-root253:0   0 75G  0lvm  /

└─sda1           8:1   0   1G  0part /boot

4、格式化磁盘

# mkfs.xfs /dev/sdb -f

# mkfs.xfs /dev/sdc -f

六、遇到的问题

1、擦除磁盘中的超级块中的数据

用磁盘作为Bcache磁盘前,请先确保磁盘是空的,或者磁盘中的数据无关紧要。如果磁盘中有文件系统,将会出现如下错误:

# make-bcache -C /dev/sdc

Device /dev/sdc already has a non-bcache superblock, remove it using wipefs and wipefs -a

擦除磁盘中的超级块信息:

# wipefs -a /dev/sdc

/dev/sdc:2 bytes were erased at offset0x00000438(ext4):53ef

2、如果使用make-bcache命令出现了如下打印,那就说明当前磁盘已经是bcache磁盘,

# make-bcache -B /dev/sdb

Already a bcache device on /dev/sdb, overwrite with --wipe-bcache

加上 --wipe-bcache参数就可以了:

# make-bcache -B /dev/sdb --wipe-bcache

3、设备处于繁忙中

# make-bcache -C /dev/sdf -B  /dev/sdc

Can't open dev /dev/sdf: Device or resource busy

这时候应该可以看到这个lv的superblock还有信息,这就是原因.

# bcache-super-show /dev/sdf

# wipefs -af /dev/sdf

# dd if=/dev/zero of=/dev/sdf bs=1M count=512

# reboot

相关话题

特别声明:以上内容(如有图片或视频亦包括在内)均为站长传媒平台用户上传并发布,文章为企业广告宣传内容,本平台仅提供信息存储服务,对本页面内容所引致的错误、不确或遗漏,概不负任何法律责任,相关信息仅供参考。任何单位或个人认为本页面内容可能涉嫌侵犯其知识产权或存在不实内容时,可及时向站长之家提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明(点击查看反馈联系地址)。本网站在收到上述法律文件后,将会依法依规核实信息,沟通删除相关内容或断开相关链接。

推荐关键词

24小时热搜

查看更多内容

大家正在看