使用bcache加速hdd的原理及简单应用示例

2024-04-07 17:28

本文主要是介绍使用bcache加速hdd的原理及简单应用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bcache 是一种简单有效的方法,通过使用小容量高速磁盘(如 SSD )让大容量的低速磁盘(通常为 HDD )展现出与高速磁盘相近的性能。例如我们在 ceph 生产环境中,利用 bcache 将小容量的 SSD 盘作为一组大容量 HDD 的缓存,达到节省成本和提高性能的效果。

bcache内核模块仅在Linux 3.10及以上版本支持,因此使用Bcache,需要将内核升级到3.10及以上版本,并在内核配置项中打开Bcache模块。

bcache中的常用术语

  • backing device 后端存储盘,通常为低俗大容量磁盘,是实际保存数据的磁盘
  • cache device 缓存盘,通常指高速小容量磁盘
  • dirty cache 脏缓存,数据暂时只存在于缓存盘而未刷新到存储盘中
  • writeback 回写,数据写入时, 只要缓存盘写入成功, 写入请求就立即返回成功,缓存盘中的数据会定期刷写到后端存储盘中
  • writethrough 直写,数据写入时, 必须缓存盘和存储盘都写入成功, 写入请求才返回成功,因此该模式对于写入性能无提升,适用于读多写少的场景,可以保证数据的强一致性

原理简介

磁盘缓存的概念其实一直存在,比如操作系统中的内存。当从磁盘读取数据时,数据会被复制到 RAM 中。如果数据已经存在于 RAM 中,就会直接从 RAM 读取,而不是再次从磁盘读取。当数据写入磁盘时,它会先写入 RAM,然后过一会儿再写入磁盘。由于 RAM 是易失的,数据在 RAM 中停留的时间非常短。

bcache 与此类似,只是它有多种缓存操作模式。写入数据较快的模式是 writeback。它的工作方式与 RAM 相同,只不过 RAM 被 NVME SSD 设备所取代。数据可能在缓存中停留更长时间,甚至永久停留,因此存在一定的风险,例如当 SSD 损坏时,只存在于缓存中的数据会丢失,这很可能会导致整个文件系统无法访问。

bcache的简单创建

准备一块SSD(本文中为sdb,10GB)和一块HDD(本文中为sdc,100GB),在创建bcache前我们先来对两块盘的性能做简单测试:

# 在裸设备上创建文件系统并挂载
[root@ecs-91176055 /]#  mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=655360 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=1, sparse=1, rmapbt=0=                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
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
Discarding blocks...Done.[root@ecs-91176055 /]#  mkfs.xfs /dev/sdc
meta-data=/dev/sdc               isize=512    agcount=4, agsize=6553600 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=1, sparse=1, rmapbt=0=                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.[root@ecs-91176055 /]#  mkdir /ssd
[root@ecs-91176055 /]#  mkdir /hdd 
[root@ecs-91176055 /]#  mount /dev/sdb /ssd
[root@ecs-91176055 /]#  mount /dev/sdc /hdd# 进行简单的读写性能测试
# ssd写性能
[root@ecs-91176055 /]#  dd if=/dev/zero of=/ssd/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 32.161 s, 163 MB/s# hdd写性能
[root@ecs-91176055 /]#  dd if=/dev/zero of=/hdd/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 242.547 s, 21.6 MB/s# ssd读性能
[root@ecs-91176055 /]#  dd if=/ssd/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 32.1591 s, 163 MB/s# hdd读性能
[root@ecs-91176055 /]#  dd if=/hdd/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 148.681 s, 35.3 MB/s# 测试完成卸载卷
[root@ecs-91176055 /]#  umount /dev/sdb
[root@ecs-91176055 /]#  umount /dev/sdc

我们可以得到如下数据:

写速度读速度
SSD163MB/s163MB/s
HDD21.6MB/s35.3MB/s

接下来使用sdb作cache device,sdc作backing device

# 加载bcache内核模块
[root@ecs-91176055 ~]#  modprobe bcache
# 验证内核模块是否加载
[root@ecs-91176055 ~]#  lsmod | grep bcache
bcache                270336  0 
crc64                  16384  1 bcache# 安装bcache-tools
[root@ecs-91176055 ~]#  yum install bcache-tools -y# bcache无法使用分区或已有文件系统的磁盘,因此先使用wipefs擦除磁盘上的元数据信息
[root@ecs-91176055 ~]#  wipefs -a /dev/sdb
/dev/sdb: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42
[root@ecs-91176055 ~]#  wipefs -a /dev/sdc
/dev/sdc: 4 bytes were erased at offset 0x00000000 (xfs): 58 46 53 42# 创建backing device
[root@ecs-91176055 ~]#  bcache make -B /dev/sdc
Name                    /dev/sdc
Label
Type                    data
UUID:                   051db5a8-0c82-4c4c-a0a9-25da423b950c
Set UUID:               e41856dc-f3ab-4672-84cf-56507d10bf9a
version:                1
block_size_in_sectors:  1
data_offset_in_sectors: 16# 注册设备
[root@ecs-91176055 ~]#  bcache register /dev/sdc# 创建cache device
[root@ecs-91176055 ~]#  bcache make -C /dev/sdb
Name                    /dev/sdb
Label
Type                    cache
UUID:                   8ba34ba9-ca35-4c51-ba3d-cb08e6777047
Set UUID:               2f1f6fd1-6549-4b77-9a57-0fbe0c5669aa
version:                0
nbuckets:               20480
block_size_in_sectors:  1
bucket_size_in_sectors: 1024
nr_in_set:              1
nr_this_dev:            0
first_bucket:           1
/dev/sdb blkdiscard beginning...done# 注册设备
[root@ecs-91176055 ~]#  bcache register /dev/sdb# 将存储盘挂载到缓存盘
[root@ecs-91176055 ~]#  bcache attach /dev/sdb /dev/sdc# 设置写入策略为writeback
[root@ecs-91176055 ~]#  bcache set-cachemode /dev/sdc writeback# 查看bcache设备状态
[root@ecs-91176055 ~]#  bcache show
Name            Type            State                   Bname           AttachToDev
/dev/sdb        3 (cache)       active                  N/A             N/A
/dev/sdc        1 (data)        clean(running)          bcache0         /dev/sdb[root@ecs-91176055 /]#  mkdir /bcache 
# 挂载bcache设备
[root@ecs-91176055 /]#  mount /dev/bcache0 /bcache# bcache写性能
[root@ecs-91176055 /]#  dd if=/dev/zero of=/bcache/testfile bs=1M count=5000 oflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 65.822 s, 79 MB/s# bcache读性能
[root@ecs-91176055 /]#  dd if=/bcache/testfile of=/dev/null bs=1M count=5000 iflag=direct
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB, 4.9 GiB) copied, 65 s, 80 MB/s

得到如下数据:

写速度读速度
SSD163MB/s163MB/s
HDD21.6MB/s35.3MB/s
bcache79MB/s80MB/s

总结

可以看到,理论上期望的 bcache 设备速度与缓存设备一样快是不可能实现的。平均而言,bcache 的速度明显较慢,但较单一HDD已经有较大提升。

以下命令提供了必要的优化,以从 bcache 设备获得更好的性能。

echo 0 > /sys/block/bcache0/bcache/cache/congested_write_threshold_us
echo 0 > /sys/block/bcache0/bcache/cache/congested_read_threshold_us
echo 600000000 > /sys/block/bcache0/bcache/sequential_cutoff
echo 40 > /sys/block/bcache0/bcache/writeback_percent

有关bcache的更多信息可以参考:https://www.kernel.org/doc/html/latest/admin-guide/bcache.html

这篇关于使用bcache加速hdd的原理及简单应用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883216

相关文章

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认