zoukankan      html  css  js  c++  java
  • Linux下SSD缓存加速之bcache使用

    在Linux下,使用SSD为HDD加速,目前较为成熟的方案有:flashcache,enhanceIO,dm-cache,bcache等,多方面比较以后最终选择了bcache。 bcache 是一个 Linux 内核块层超速缓存。它允许使用一个或多个高速磁盘驱动器(例如 SSD)作为一个或多个速度低得多的硬盘的超速缓存。bcache 支持直写和写回,不受所用文件系统的约束。默认情况下,它只超速缓存随机读取和写入,这也是 SSD 的强项。它还适合用于台式机、服务器和高端储存阵列。CentOS和Ubuntu都可以使用bcache。bcache是在3.10以后的版本加入mainline的,因此需要3.10以上的内核版本。但是笔者使用Centos 7在3.10.0的内核上进行配置时,发现无法生成相应的配置文件节点,测试过程中使用4.3.3版的内核。

     

    主要功能:

    1,可以使用单个超速缓存设备来超速缓存任意数量的后备设备。在运行时可以挂接和分离已装入及使用中的后备设备。

    2,在非正常关机后恢复 - 只有在超速缓存与后备设备一致后才完成写入。

    3,SSD 拥塞时限制传至 SSD 的流量。

    4,高效的写回实施方案。脏数据始终按排序顺序写出。

    5,稳定可靠,可在生产环境中使用。

    代码安装:

    代码可以从github或官方网站上获取,但是master的代码版本非常老,dev branch的代码比较新。两种版本是不同的团队维护的,但是不管哪一个版本,在Ubuntu上编译都挺顺利,到了Centos上就遇到重重阻碍,有些甚至莫名奇妙,最后放弃了。

    官方网站上获取:

    git clone http://evilpiepirate.org/git/linux-bcache.git

    编译bcache-tools:

    # cd bcache-tools/
    # make & make install

     

    Bcache配置

    以下配置方法介绍中使用sdc表示cache device,也就是SSD的盘符,使用sdb表示backing device,也就是HDD的盘符。

    格式化硬盘分区

    应用硬盘到bcache模式之前需要将目标分区格式化为bcache,这一步会破坏磁盘分区中所有数据。方法和信息如下

    # 如果磁盘是第一次使用,或完全是空的,第一步通常不用执行,这一步市为了擦除分区文件信息,如果挂载也要先卸载,否则会出现device busy的问题
    # wipefs -a /dev/sdb /dev/sdc
    
    # make-bcache -B /dev/sdb
    UUID:           55d95b33-0736-4650-8fc0-c498c34c0feb
    Set UUID:       d62afd66-1f24-490b-985f-21176037e0ed
    version:        1
    block_size:     1
    data_offset:    16
    
    # 最后面的3个参数都可以不要,配置好以后可以通过控制节点进行修改
    # make-bcache -C /dev/sdc -w4k -b1M --writeback
    UUID:           f5ec37ac-2a74-48e0-85ed-1ae23810a4d2
    Set UUID:       529b2734-5e08-4724-9893-f28b37735ad6
    version:        0
    nbuckets:       32768
    block_size:     1
    bucket_size:    1024
    nr_in_set:      1
    nr_this_dev:    0
    first_bucket:   1

    缓存参数意义:

    -B: 设置backing device
    -C: 设置cache device
    -w: block size (hard sector size of SSD),默认是2K,可使用--block=4K代替
    -b: bucket size,可以使用--bucket=1M代替

     

    设备注册

    格式化完成后需要完成设备的注册,使内核获取设备,可能由于内核版本的问题,在实际配置中发现,会报错,提示无法向register节点写入信息,但是并不影响使用。

    # echo /dev/sdb > /sys/fs/bcache/register
    # echo /dev/sdc > /sys/fs/bcache/register

    也可以通过下面的方式实现设备自动注册:

    echo /dev/sd* > /sys/fs/bcache/register_quiet

    完成注册以后会产生相应的系统节点,后面会有更详细的介绍:

    /dev/bcache/
    /dev/bcache
    /sys/block/bcache0/
    /sys/fs/bcache/

    设备绑定

    完成注册的backing device需要在使用之前绑定到bchache,否则功能无法启用。首先找到完成注册的backing device设备的

    #ls /sys/fs/bcache/
    60fbcc3b-4f8e-485b-9f3c-c258c157d614  register  register_quiet

     那么< UUID > = 60fbcc3b-4f8e-485b-9f3c-c258c157d614。

    #echo <UUID> > /sys/block/bcache<n>/bcache/attach

    重新启动系统,完成配置。

    实际配置后的磁盘情况,其中使用sdq作为backing device,sdr是SSD硬盘,单独建立一个16G分区作为cache用于性能测试。

    # lsblk
    sdq              65:0    0 558.9G  0 disk
    └─bcache0       252:0    0 558.9G  0 disk
    sdr              65:16   0 745.2G  0 disk
    └─sdr1           65:17   0    16G  0 part
      └─bcache0     252:0    0 558.9G  0 disk

    在/dev/目录下面你可以找到相应的bcache节点,相应的bcache会产生一些文件节点,比如下面的位置可以看到对应的绑定的两个磁盘:

    # ls /sys/block/sdq/bcache/dev/slaves/
    sdq  sdr1

     

    Bcache device状态查看

    # bcache-super-show -f /dev/sdr
    sb.magic ok
    sb.first_sector 8 [match]
    sb.csum 532A75DDACA80EC8 [match]
    sb.version 1 [backing device]
    
    dev.label (empty)
    dev.uuid 0bb0de96-f7df-4fed-9280-b6e0615718da
    dev.sectors_per_block 1
    dev.sectors_per_bucket 1024
    dev.data.first_sector 16
    dev.data.cache_mode 1 [writeback]
    dev.data.cache_state 0 [detached]
    
    cset.uuid 538edd49-6d68-4fb0-8471-49a3346fae90
    # bcache-super-show -f /dev/sds1
    sb.magic ok
    sb.first_sector 8 [match]
    sb.csum 18DA32EC2B332BE2 [match]
    sb.version 3 [cache device]
    
    dev.label (empty)
    dev.uuid 00a196c4-2af9-41b5-a450-e130ab1389e4
    dev.sectors_per_block 8
    dev.sectors_per_bucket 2048
    dev.cache.first_sector 2048
    dev.cache.cache_sectors 33552384
    dev.cache.total_sectors 33554432
    dev.cache.ordered yes
    dev.cache.discard no
    dev.cache.pos 0
    dev.cache.replacement 0 [lru]
    
    cset.uuid 60fbcc3b-4f8e-485b-9f3c-c258c157d614

     

    设置文件系统和挂载

    这个我就不同多说了,/dev/bcache可以当做普通盘符直接格式化所需的文件系统挂载:

    #mkfs.ext4 /dev/bcache0
    #mount /dev/bcache0 /mnt

     

    停用设备

    注销设备:

    echo 1 >/sys/fs/bcache/<UUID>/unregister

    停用bcache:

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

    擦除磁盘残留数据:

    sudo wipefs -a /dev/sdc
    sudo wipefs -a /dev/sdb

     

    工作模式

    bcache有四种不同工作模式:
    writethrough、writeback、writearouond、none

    工作模式切换:

    echo writeback > /sys/block/sdr/bcache/cache_mode

     

    参考文章

    https://bcache.evilpiepirate.org/

    https://wiki.archlinux.org/index.php/Bcache

    https://www.mr-mao.cn/archives/linux-bcache-performance-testing.html

    http://blog.csdn.net/liumangxiong/article/details/18090043

     

  • 相关阅读:
    urlEncode
    rsyslog queue队列权威指南
    rsyslog的安装、使用、详解
    长连接及心跳保活原理简介
    python时间日期格式化和反格式化
    无锁编程
    如何快速定位找出SEGV内存错误的程序Bug
    ElasticSearch搜索数据到底有几种方式?
    golang string和[]byte的对比
    PHP中使用Redis长连接笔记
  • 原文地址:https://www.cnblogs.com/zhangxinglong/p/14247606.html
Copyright © 2011-2022 走看看