头条 科技 产经 家电 智能 手机 芯片 数码 电商 WAP版
中国IT产经新闻网-移动互联网与智能搜索领域是未来IT产业发展的趋势!
中国IT产经新闻/快递物流/正文
智汇华云 | bcache原理及实践
来源:
2023-08-19
编辑:晓露

    一、前言

  简单介绍下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

  bcache-tools 源码:

  (一)、升级内核

  注意:编译前修改.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 ?0 disk

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

  └─bcache0 ? ? ? 252:0 ? ?0 ?200G ?0 disk

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

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

  对bcache0进行格式化操作了。

  # mkfs.xfs /dev/bcache0

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

  = ? ? ? ? ? ? ? ? ? ? ? sectsz=512 ? attr=2, projid32bit=1

  = ? ? ? ? ? ? ? ? ? ? ? crc=0 ? ? ? ?finobt=0

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

  = ? ? ? ? ? ? ? ? ? ? ? sunit=0 ? ? ?swidth=0 blks

  naming ? =version 2 ? ? ? ? ? ? ?bsize=4096 ? ascii-ci=0 ftype=0

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

  = ? ? ? ? ? ? ? ? ? ? ? sectsz=512 ? sunit=0 blks, 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 ?0 disk

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

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

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

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

  └─sda1 ? ? ? ? ? ?8:1 ? ?0 ? ?1G ?0 part /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 ?0 disk

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

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

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

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

  └─sda1 ? ? ? ? ? ?8:1 ? ?0 ? ?1G ?0 part /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足够强大,可以不跟踪,减少跟踪的开销。

  # echo 0 > /sys/fs/bcache//congested_read_threshold_us

  # echo 0 > /sys/fs/bcache//congested_write_threshold_us

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

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

  The default is 2000 us (2 milliseconds)?for?reads,?and?20000?for?writes.

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

  #?echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

  设置回默认值:

  #?echo 4194304 ? > /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 ?0 disk

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

  └─bcache0 ? ? ? 252:0 ? ?0 ?200G ?0 disk

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

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

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

  2、删除后端盘

  # umount /wyl/

  # echo 1 > /sys/block/bcache0/bcache/stop

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

  # lsblk

  NAME ? ? ? ? ? ?MAJ:MIN RM ?SIZE RO TYPE MOUNTPOINT

  sdb ? ? ? ? ? ? ? 8:16 ? 0 ? 80G ?0 disk

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

  └─bcache0 ? ? ? 252:0 ? ?0 ?200G ?0 disk

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

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

  3、验证

  # lsblk

  NAME ? ? ? ? ? ?MAJ:MIN RM ?SIZE RO TYPE MOUNTPOINT

  sdb ? ? ? ? ? ? ? 8:16 ? 0 ? 80G ?0 disk

  sr0 ? ? ? ? ? ? ?11:0 ? ?1 1024M ?0 rom

  fd0 ? ? ? ? ? ? ? 2:0 ? ?1 ? ?4K ?0 disk

  sdc ? ? ? ? ? ? ? 8:32 ? 0 ?200G ?0 disk

  sda ? ? ? ? ? ? ? 8:0 ? ?0 ? 80G ?0 disk

  ├─sda2 ? ? ? ? ? ?8:2 ? ?0 ? 79G ?0 part

  │ ├─centos-swap 253:1 ? ?0 ? ?4G ?0 lvm ?[SWAP]

  │ └─centos-root 253:0 ? ?0 ? 75G ?0 lvm ?/

  └─sda1 ? ? ? ? ? ?8:1 ? ?0 ? ?1G ?0 part /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?offset 0x00000438 (ext4): 53 ef

  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

产业点评更多
厂商动态更多
热门综合更多
CopyRight @ 2008-2023 中国IT产经新闻网 All Right Reserved 违者必究 湘ICP备2022017330号-2