智汇华云 | 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,参考:
http://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、官网下载内核
http://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 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
智汇华云 | bcache原理及实践相关推荐
- openstack云主机无法绑定ip_智汇华云|OpenStack 虚拟机 GPU 性能优化
随着大数据.人工智能技术的发展,越来越多的用户产生了获取拥有GPU算力的弹性计算服务的需求,GPU云主机具有突出的图形处理和高性能计算能力,适用于科学计算.视频处理.深度学习等应用场景,受到了市场的青 ...
- 智汇华云 | ArSDN之分布式路由及浮动IP简介
随着互联网.云计算.网络存储.物联网为代表的新应用.新运营模式的兴起,不仅带来流量的快速增长,更使得用户在建设多业务IP网络的同时,面临更加复杂的运维挑战以及对业务进行快速导入与部署的要求.本期智汇华 ...
- 智汇华云|安超云套件Archer Cloudsuite为“信创强国”筑基
华云数据作为信创云计算专家,为帮助政企用户实现全面云化,继2019年发布国产通用型云操作系统安超OS后,又于2020年推出了安超云套件 Archer Cloudsuite.安超云套件Archer Cl ...
- 重磅!赋能产业数字化转型获认可 华云数据喜获多项殊荣
9月29日,由中国电子信息产业发展研究支持,赛迪网.<数字经济>杂志主办的2021(第四届)行业信息化技术创新发展峰会顺利召开.本次峰会以"数智创新 转型升级"为主题, ...
- 华云数据智汇琅琊工业互联网创新中心正式揭牌 发布琅琊智造工业互联网平台
2021年10月29日,临沂市工业互联网牵手行动现场会-兰陵站暨琅琊智造工业互联网平台发布仪式顺利召开.本次活动由临沂市工业和信息化局指导,临沂市工业互联网协会.兰陵县工业和信息化局主办,华云数据.临 ...
- 20145226夏艺华 后门原理与实践
20145226夏艺华 后门原理与实践 实验主要内容 使用ncat.socat实现两台电脑间的后门连接:meterpreter的应用:MSF POST模块的使用 基础问题回答 例举你能想到的一个后门进 ...
- 触控操作新体验 云智汇M11记录仪首测
仅仅是拍摄行车视频的行车记录仪还能为我们带来怎样的惊喜呢?在经过市场和用户的检验后行车记录仪正在以一个良好的势头发展,没有出现井喷爆发的现象,这就为行车记录仪技术上的进步和创新提供了适宜的环境,研发的 ...
- OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
OpenStack Days China Day2的主题演讲中,郑军博士以Franz Liszt 的名言"To cast a javelin into the infinite spaces ...
- 云原生服务网格Istio:原理、实践、架构与源码解析
华为云原生团队600多页的Istio实战精华总结,云原生服务网格Istio:原理.实践.架构与源码解析的电子书. 图书介绍 <云原生服务网格Istio:原理.实践.架构与源码解析>分为原理 ...
最新文章
- Numpy之N维数组-ndarray
- jdk和cglib代理
- 2018年房价到底会不会涨!
- 加密芯片——RSA算法特点与应用注意事项
- jquery java aes_[代码全屏查看]-java、js之间使用AES加密通信数据
- 无法显示jinglingzhoushou-2.0.4.AppImage
- shopex 小知识
- 高等数学期末复习——知识点梳理
- 用matlab画圆极化波,应用HFSS-MATLAB-API设计圆极化微带天线
- java 制作甘特图,看我如何用简单的步骤打造出复杂的web甘特图
- 计算机在英语翻译上的运用,有道如何在网页上翻译一句话,有道网页上的字翻译怎么用...
- powder-puff 花拳绣腿
- arduino: 各种Arduino基础器件的用法图
- 数据库共享锁与排它锁
- python中的除法,取整和求模
- java.lang.IllegalArgumentException: Name for argument type [java.lang.Integer] not available异常
- 第4代计算机的应用,在第四代计算机期间内计算机的应用逐步进入到().docx
- java cursor属性_cursor的使用 怎么使用cursor 中的数据
- AI取代会议同传,还需几步?
- Django入门,制作在线相册管理
热门文章
- 复制小米手机Redmi Note 9 Pro中的录音文件到电脑端(phone到pc)
- 班迪(高清录制视频) 中文最新(附带工具)
- 利用Resttemplate进行put请求
- 【Mpich_linux-centos7.9系统下最全编译安装调用】
- ARM_SMMU_下
- Java中SQL语句写模糊查询_到底Java里的模糊查询语句该怎么写
- 解决网页不能复制或者超星答题不可粘贴
- 凯利讯半导体介绍高压电容器的主要作用
- Android自定义系列——7.Path之基本操作
- 计算机学校要学籍吗,对普通高中学校学籍档案信息化管理相关问题的几点探讨...