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的更多相关文章

  1. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  2. Linux块设备驱动详解

    <机械硬盘> a:磁盘结构 -----传统的机械硬盘一般为3.5英寸硬盘,并由多个圆形蝶片组成,每个蝶片拥有独立的机械臂和磁头,每个堞片的圆形平面被划分了不同的同心圆,每一个同心圆称为一个 ...

  3. Linux块设备和字符设备

    块设备:系统能够随机无序访问固定大小的数据片的设备,这些数据片称为块.块设备是以固定大小长度来传送资料的,它使用缓冲区暂存数据,时机成熟后从缓存中一次性写入到设备或者从设备中一次性放到缓存区.常见的块 ...

  4. (linux)块设备驱动程序

      1.4.1  Linux块设备驱动程序原理(1) 顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备.块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例如 ...

  5. linux块设备模型架构框架

    Linux块设备的原理远比字符设备要复杂得多,尽管在linux这一块的方法论有很多相似之处,但考虑到它是用中块结构,它常常要搭配内存页管理,页缓冲块缓冲来改善硬盘访问的速度,按照块硬件最大的性能要求进 ...

  6. Linux块设备驱动(一) _驱动模型

    块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...

  7. Linux块设备IO子系统(二) _页高速缓存

    磁盘驱动就是实现磁盘空间和内存空间数据上的交互,在上一篇中我们讨论了内存端的Page Segment Block Sector相关的概念,本文以3.14内核为例,讨论这部分内存是如何被组织管理的.我们 ...

  8. Linux块设备加密之dm-crypt分析

    相关的分析工作一年前就做完了,一直懒得写下来.现在觉得还是写下来,以来怕自己忘记了,二来可以给大家分享一下自己的研究经验. 这篇文章算是<Device Mapper代码分析>的后续篇,因为 ...

  9. Linux块设备IO子系统(一) _驱动模型

    块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,块设备(blockdevice)是一种具有一定结构的随机存取设备,对这种设备的读写是按块(所以叫块设备)进行的,他使用缓 ...

随机推荐

  1. 初识IntPtr

    一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较 ...

  2. ant编译apache-nutch-2.2.1结合mysql实现爬虫的安装配置全过程

    之前的数据抓取都是用的八爪鱼软件,老大突发奇想要我自己搞个爬虫来抓取数据,网上找找貌似apache的nutch比较合适,于是就开始安装这啥nutch. 对于一个linux零基础的人来说,还要先学学li ...

  3. [日常] DNS的迭代查询过程

    DNS是应用层协议,端口号为tcp/53和udp/53 DNS查询过程,比如访问www.test.com1.客户机查询www.test.com2.查询首选DNS服务器,Linux下/etc/resol ...

  4. 响应式布局和BootStrap 全局CSS样式

    1.什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,这个概念是为解决移动互联网浏览而诞生的. 简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一 ...

  5. QT5.4.2静态编译(包含QtWebKit),在VS2013上创建项目,并成功运行

            Qt项目发布的exe程序,默认是以动态链接形式的,这样发布后的程序会附带好多Qt自己的dll库,这样文件数量不仅多,而且移植到其他电脑上的时候,还可能会遇到,提示缺其他库等各种运行不起 ...

  6. 浅谈脚本化css(二)

    查询计算样式 window上面有一个方法叫做getComputedStyle可以来获取元素的计算样式,也就是css样式.   window.getComputedStyle(ele. null); J ...

  7. SpringMVC接受请求参数、

    1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...

  8. 慕课网 深入浅出javascript 笔记

    javascript 数据类型 5种简单数据类型:Number.String.Boolean.Undefined.Null 1种复杂数据类型:Object =    表示赋值: ==  表示比较,但是 ...

  9. C#+MapServer相关代码

    //放大的代码: private void MapZoomIn(NameValueCollection queryString) { mapObj map = Session["MapSer ...

  10. mybatis resultMap 映射配置

    现有数据库表: CREATE TABLE `dept_p` ( `DEPT_ID` ) NOT NULL, `DEPT_NAME` ) DEFAULT NULL, `PARENT_ID` ) DEFA ...