linux块设备缓存bcache
1 Bcache介绍
Bcache是一种缓存技术,它是根据SSD的特性设计的,由于SSD的随机读写速度要比普通硬盘的随机读写快N多倍,但是一般SSD的容量小且贵,当然土豪除外,所以我们可以综合SSD的读写速度快和HDD的容量大的优点,这就可以使用bcache来做到,将SSD作为HDD的缓存磁盘,,即保证了读写速度,又省了一大笔资金,何乐不为。
2 使用Bcache的工作准备
由于bcache是在kernel 3.10之后才加上的,所以需要确保你的内核是3.10以上的,可以使用命令uname -a查看你的内核版本:
[root@localhost ~]# uname -a
Linux thinstack-qtGr8j 3.10.-514.26..el7.x86_64 # SMP Fri Jun :: CST x86_64 x86_64 x86_64 GNU/Linux
首先检测下你的内核中有没有包含bcache模块,检测的方式有两种:
(1)查看是否存在于内核中,检查/sys/fs/bcache目录是否存在,没有则说明内核中没有bcache
(2)查看bcache是否以内核模块的形式存在,检查/lib/modules/<$version>/kernel/drivers/md/bcache目录是否存在,如果存在则可以运行modprobe bcache命令来加载bcache模块,不存在则说明内核中没有bcache。
默认内核并没有将bcache编译进内核,可以通过下载内核源码包重新编译将bcache以内核模块的形式编译进内核,编译方法介绍:自定义配置编译linux内核。
内核中有bcache模块后,要使用bcache还需要一个工具:bcache-tools,它提供了make-bcache工具, centos源上是没有这个rpm包的,需要自己下载源码然后进行编译,在进行编译前需要下载几个依赖包:
yum install pkgconfig libblkid-devel
下载rpm的一些打包工具包:
yum install rpmdevtools rpm-build
可以去github上下载源代码:https://github.com/g2p/bcache-tools/tree/v1.0.8
然后编写bcache-tools-1.0.8.spec文件,spec文件内容参考:
Name: bcache-tools
Version: 1.0.8
Release: %(date '+%Y%m%d%H')%{?dist}
Summary: common functions. Group: xxx
License: Properpity
URL: xxx
Source: bcache-tools-1.0.8.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: gcc
Requires: glibc libuuid openssl kernel >= 3.10.0 %description
This package contains the bcache tools for making bcache device %prep
%setup -q -n bcache-tools-1.0.8 %build
make %{?_smp_mflags} %install
#rm -rf %{buildroot}
echo %{buildroot}
echo %{dist}
echo %{release}
mkdir -p %{buildroot}/usr/sbin/
mkdir -p %{buildroot}/lib/udev/
mkdir -p %{buildroot}/lib/udev/rules.d/
mkdir -p %{buildroot}/usr/share/man/man8/
mkdir -p %{buildroot}/usr/share/initramfs-tools/hooks/
mkdir -p %{buildroot}/usr/lib/initcpio/install/
mkdir -p %{buildroot}/lib/dracut//modules.d/90bcache/
make install DESTDIR=%{buildroot} %clean
rm -rf %{buildroot} %post
%postun %files
#/usr/sbin/make-bcache
#/usr/sbin/*
#/usr/sbin/bcache-super-show
#/lib/udev/probe-bcache
#/lib/udev/bcache-register
#/lib/udev/*
#/lib/udev/rules.d/69-bcache.rules
#/usr/share/man/man8/*
#/usr/share/initramfs-tools/hooks/bcache
#/usr/lib/initcpio/install/bcache
#/lib/dracut/modules.d/90bcache/module-setup.sh /usr/share/*
/usr/*
/lib/* %changelog
可以先执行rpmdev-setuptree命令在home目录下生成rpm目录
将源代码打包成tar.gz的压缩包放入~/rpmbuild/SOURCES/目录下:
tar -zcvf ~/rpmbuild/SOURCES/bcache-tools-1.0..tar.gz bcache-tools-1.0.
将bcache-tools-1.0.8.spec文件复制到~/rpmbuild/SPECS/目录下,然后执行:
rpmbuild -bb ~/rpmbuild/SPECS/ bcache-tools.spec
同时在编译过程中如果出现这样的错误,提示找不到errno.h等头文件,说明缺少一些头文件了,这时去看下/usr/include/linux目录是否存在,如果不存在,先安装kernel-headers的rpm包,如果没出错则在~/rpmbuild/RPMS/x86_64/目录下看到bcache-tools的rpm包。
3 使用Bcache
3.1 添加缓存磁盘操作
首先选择一个SSD盘作为缓存磁盘,当然如果只是测试,那么选择一个普通硬盘来做也是可以的,假设选择的盘是/dev/sdb,则使用命令来创建缓存盘:
[root@localhost ~]# make-bcache -C /dev/sdb
UUID: 60a170c4-fde4-40af-aa1c-97ed79139699
Set UUID: b69c5773-c8a9-49b1-89cc-e0638652977c
version:
nbuckets:
block_size:
bucket_size:
nr_in_set:
nr_this_dev:
first_bucket:
选择一个普通硬盘作为缓存磁盘的后端磁盘,这里假设选择的盘是/dev/sdc,则使用命令来创建后端磁盘:
[root@localhost ~]# make-bcache -B /dev/sdc
UUID: cbad64dd--49b5-b22c-e006ab7cdb0c
Set UUID: a9bf6ced-10e1--a80f-f2b7efc45ff3
version:
block_size:
data_offset:
使用lsblk查看磁盘状态,可以看到后端磁盘已经有一个bcache0,同时存在设备/dev/bcache0:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda : 20G disk
├─sda1 : 200M part /boot
├─sda2 : 1G part [SWAP]
└─sda3 : .8G part /
sdb : 32G disk
sdc : 32G disk
└─bcache0 : 32G disk
但这时还需将bcache0绑定到缓存磁盘中,首先查找缓存盘的uuid:
[root@localhost ~]# bcache-super-show /dev/sdb
sb.magic ok
sb.first_sector [match]
sb.csum F4550D6F828E6162 [match]
sb.version [cache device] dev.label (empty)
dev.uuid 60a170c4-fde4-40af-aa1c-97ed79139699
dev.sectors_per_block
dev.sectors_per_bucket
dev.cache.first_sector
dev.cache.cache_sectors
dev.cache.total_sectors
dev.cache.ordered yes
dev.cache.discard no
dev.cache.pos
dev.cache.replacement [lru] cset.uuid b69c5773-c8a9-49b1-89cc-e0638652977c
最后一行的cset.uuid的值就是我们要找的uuid,然后进行attach操作完成添加缓存磁盘:
[root@localhost~]# echo "b69c5773-c8a9-49b1-89cc-e0638652977c" > /sys/block/bcache0/bcache/attach
此时查看磁盘状态:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda : 20G disk
├─sda1 : 200M part /boot
├─sda2 : 1G part [SWAP]
└─sda3 : .8G part /
sdb : 32G disk
└─bcache0 : 32G disk
sdc : 32G disk
└─bcache0 : 32G disk
可以看到已经添加成功了。
要使用的话就是将/dev/bcache0进行格式化并挂载到一个目录下来使用,比如:
mkfs.ext4 -F /dev/bcache0
mkdir -p /test
mount /dev/bcache0 /test/
概念:数据是先写到缓存磁盘,缓存磁盘再将数据刷回到后端磁盘,后端磁盘是真正存储数据的地方,缓存磁盘相当于是中间转接作用。
可能遇到的错误:
在使用make-bcache命令对一个磁盘操作时可能会失败,一般情况是因为该磁盘有其它数据,可以使用wipefs -a /dev/xxx来擦除该磁盘的头部超级块信息,然后再使用make-bcache命令,当然再使用wipefs命令时确保该磁盘的数据已经无用。
3.2 删除缓存磁盘
删除缓存磁盘其实就是添加缓存磁盘顺序倒着放
先将bcache0从缓存磁盘中detach掉:
echo "b69c5773-c8a9-49b1-89cc-e0638652977c" > /sys/block/bcache0/bcache/detach
注销掉缓存磁盘:
echo 1 > /sys/fs/bcache/b69c5773-c8a9-49b1-89cc-e0638652977c/unregister
注销成功会看到 /sys/fs/bcache/该目录下没有b69c5773-c8a9-49b1-89cc-e0638652977c了
最后停掉后端磁盘的缓存磁盘:
如果刚才有挂载操作则需要先umount掉:
umount /dev/bcache0
echo 1 >/sys/block/bcache0/bcache/stop
此时使用lsblk查看则会看到没有bcache了
4 Bcache的三种缓存策略
(1)writeback回写策略:数据先写入到缓存磁盘,再等待系统将缓存磁盘数据刷到后端磁盘
(2)writethrough写通策略:数据会同时写入缓存磁盘和数据磁盘(默认是该模式)
(3)writearound直达策略:数据直接写入后端磁盘
这些策略是可以动态修改的,比如修改到writeback的修改方式(建议使用writeback):
echo writeback > /sys/block/bcache/bcache/cache_mode
5 Bcache的一些开机启动配置
5.1 开机自动挂载
比如上方提到的挂载bcache0到一个目录,则需要将需要挂载信息添加到/etc/fstab文件里,这样开机时才会自动挂载,比如在/etc/fstab文件中添加一行:
echo UUID=c4d9c15f-3d6d-446b-8cb5-3d51a9400a22 /test/ xfs noatime,nobarrier,inode64,delaylog 0 0 >> /etc/fstab
这个uuid可以通过命令blkid /dev/bcache0获得:
/dev/bcache0: UUID="c4d9c15f-3d6d-446b-8cb5-3d51a9400a22" TYPE="xfs"
当然删除缓存磁盘后也别忘了把这行删掉,否则系统启动时会启动不起来,进入紧急模式。
5.2 开机自动加载Bcache模块
如果不设置开机自动加载该模块,则启动后会看不到bcache信息
创建/etc/sysconfig/modules/bcache.modules该文件
输入:
#!/bin/sh
modprobe bcache >/dev/null >&
exit
chmod 777 /etc/sysconfig/modules/bcache.modules
6.Bcache的性能调优
bcache有很多配置选项和可调的参数,默认值适合于典型配置
(1)如果写入性能差,可以尝试将其写策略调为回写策略
echo writeback > /sys/block/bcache0/cache_mode
(2)默认情况下,bcache不会缓存顺序IO和大文件,所以顺序写性能应该没什么提升,可以打开顺序IO缓存:
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
还可以调整backing设备的顺序IO阈值,默认是4M,也就是说如果bcache设备的连续IO达到4MB以上时是直接读写backing盘,不会走SSD缓存盘,如果要设置成8M,则可如下:
echo 8M > /sys/block/bcache0/bcache/sequential_cutoff
(3)防止cache设备成为瓶颈
这种情况最可能发生在一块缓存磁盘作为多个普通盘的缓存磁盘,写入或读取处理不过来时,就会形成堵塞,这时我们可以关闭拥塞控制项,默认情况下,当读请求超过2ms,写请求超过20ms时就会直接读写backing盘。
关闭读写拥塞控制命令:
echo 0 > /sys/fs/bcache/<cache set uuid>/congested_read_threshold_us
echo 0 > /sys/fs/bcache/<cache set uuid>/congested_write_threshold_us
linux块设备缓存bcache的更多相关文章
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- Linux块设备驱动详解
<机械硬盘> a:磁盘结构 -----传统的机械硬盘一般为3.5英寸硬盘,并由多个圆形蝶片组成,每个蝶片拥有独立的机械臂和磁头,每个堞片的圆形平面被划分了不同的同心圆,每一个同心圆称为一个 ...
- Linux块设备和字符设备
块设备:系统能够随机无序访问固定大小的数据片的设备,这些数据片称为块.块设备是以固定大小长度来传送资料的,它使用缓冲区暂存数据,时机成熟后从缓存中一次性写入到设备或者从设备中一次性放到缓存区.常见的块 ...
- (linux)块设备驱动程序
1.4.1 Linux块设备驱动程序原理(1) 顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备.块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例如 ...
- linux块设备模型架构框架
Linux块设备的原理远比字符设备要复杂得多,尽管在linux这一块的方法论有很多相似之处,但考虑到它是用中块结构,它常常要搭配内存页管理,页缓冲块缓冲来改善硬盘访问的速度,按照块硬件最大的性能要求进 ...
- Linux块设备驱动(一) _驱动模型
块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...
- Linux块设备IO子系统(二) _页高速缓存
磁盘驱动就是实现磁盘空间和内存空间数据上的交互,在上一篇中我们讨论了内存端的Page Segment Block Sector相关的概念,本文以3.14内核为例,讨论这部分内存是如何被组织管理的.我们 ...
- Linux块设备加密之dm-crypt分析
相关的分析工作一年前就做完了,一直懒得写下来.现在觉得还是写下来,以来怕自己忘记了,二来可以给大家分享一下自己的研究经验. 这篇文章算是<Device Mapper代码分析>的后续篇,因为 ...
- Linux块设备IO子系统(一) _驱动模型
块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,块设备(blockdevice)是一种具有一定结构的随机存取设备,对这种设备的读写是按块(所以叫块设备)进行的,他使用缓 ...
随机推荐
- 如何移动 nuget 缓存文件夹
本文告诉大家如何移动 nuget 缓存文件夹. 因为 nuget 文件夹一般比较大,现在我的 nuget 文件夹有 10 G,默认的 nuget 文件夹是在C盘,所以需要移动他. 可以使用下面的代码查 ...
- MQ疑难杂症小记
为什么使用消息队列? 什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处.消息队列的常见使用场景,其实场景有很多,但是比较核心的有3个:解耦 ...
- mysql数据库定时任务
应用系统运行中,经常需要定时执行一些任务,例如:定时更新汇总数据,定时更新状态数据等,目前 Treesoft数据库管理系统 增加[定时任务]功能,直接通过页面简单配置,即可按调度规则定时执行SQL任务 ...
- MYSQL与MSSQL对比学习
最近在将公司的一个产品里面相关的MSSQL语句修改为可以在MYSQL上执行的语句 l 优点分析: MYSQL短小精悍,容易上手,操作简单,免费供用的.相对其它数据库有特色又实用的语法多一些.SQL怎 ...
- 设计模式学习——工厂模式(Factory Pattern)
1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...
- JXU1NDRBJXU0RTJBJXU1MjJCJXU1NDI3
U2FsdGVkX19f62S3+iSZxxJBADqNOfYV6/XumpnG7VwzMlQz7T7SaFsjyQx9d4PWAYQwtmgr4T9wDGKnKJCrR0veUEul6Uj4mEkN ...
- 如何解决“There is no locally stored library”的问题
今天我在用pyCharm开发网页的时候,用cdn引入js文件,但是程序报错,说“there is no locally stored library”.于是我上网找到了解决方案,特整理如下: 在你报错 ...
- win8.1怎么安装iis
进入系统后,在左下角处点鼠标右键,再点击[程序和功能]如下图所示: 2 进入程序和功能界面后,点击[启用或关闭Windows功能] 在WINDOWS功能对话框中找到[internet in ...
- java网络编程(TCP详解)
网络编程详解-TCP 一,TCP协议的特点 面向连接的协议(有发送端就一定要有接收端) 通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...
- 前端模块化工具--webpack学习心得
话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...