Hyper HD Bcache 建置過程

目的

傳統硬碟的成本較低的優勢,SSD 硬碟有高速的優點,但取得成本較高。將 SSD 當成 HD 的快取,提高硬碟的 IOPS 與 I/O 的存取速度

實驗結果

先來呈現一下實驗結果,利用 fio 工具測試硬碟四種讀寫狀態,read, write, randread, randwrite。

  • /dev/sda6 是 STAT 硬碟做 RAID5的情況。
  • /dev/sdb 是 SSD 硬碟。
  • /dev/bcache0 是做完 Bcache 。

可以看到傳統硬碟透過SSD當Cache後,測試起來的結果在硬碟的吞吐量或硬碟每秒讀寫的次數都有一定程度的提高。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 測試四種狀態,read, write, randread, randwrite

#read
sudo fio -filename=/dev/bcache0 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=5G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

#write
sudo fio -filename=/dev/bcache0 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=5G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

#randread
sudo fio -filename=/dev/bcache0 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=5G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

#randwrite
sudo fio -filename=/dev/bcache0 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=5G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

bw:硬碟的吞吐量,
iops:硬碟每秒讀寫的次數

順序讀

裝置 TYPE Bcache Result
/dev/sda6 read No read: io=145859MB, bw=149359KB/s, iops=9334 runt=1000005msec
/dev/sdb (pure SSD) read No read: io=153600MB, bw=669176KB/s, iops=41823, runt=235045msec
/dev/bcache0 read YES read: io=153600MB, bw=585727KB/s, iops=36607, runt=268532msec

隨機讀

裝置 TYPE Bcache Result
/dev/sda6 randread No read: io=38433MB, bw=39352KB/s, iops=2459, runt=1000066msec
/dev/sdb (pure SSD) randread No read: io=153600MB, bw=667452KB/s, iops=41715, runt=235652msec
/dev/bcache0 randread YES read:io=153600MB, bw=586100KB/s iops=36631, runt=268361msec

順序寫

裝置 TYPE Bcache Result
/dev/sda6 write No write: io=6146.8MB, bw=6293.2KB/s, iops=393, runt=1000075msec
/dev/sdb (pure SSD) write No write: io=153600MB, bw=283738KB/s, iops=17733, runt=554336msec
/dev/bcache0 write Yes write: io=110620MB, bw=113274KB/s, iops=7079, runt=1000006msec

隨機寫

裝置 TYPE Bcache Result
/dev/sda6 randwrite No write: io=10636MB, bw=10890KB/s, iops=680, runt=1000079msec
/dev/sdb (pure SSD) randwrite No write: io=153600MB, bw=276735KB/s, iops=17295, runt=568364msec
/dev/bcache0 randwrite Yes write: io=113982MB, bw=116717KB/s, iops=7294, runt=1000004msec

P.S. 測試的時候會出現 fio: /dev/bcache0 appears mounted, and ‘allow_mounted_write’ isn’t set. Aborting. 表示你有先做 /dev/bcache0 與目錄的掛載 ,需先umount 掛載目錄,ex sudo umount /bcache


安裝方法

原本要實驗二種作業系統,一個是RedHat7 和 Debain9 二個作業系統都在 Kernel 3.10 以上,但 RedHat7 作 bcache 無法產生 /dev/bcache0,過程中沒有出現任何的錯誤,原因是什麼不明,所以直接改用 Debain 9 就可以成功安裝。

Step1. Bcache 安裝

RedHat 7 git source 安裝 (放棄)

1
2
3
git clone http://evilpiepirate.org/git/bcache-tools.git
sudo yum install libblkid-devel.x86_64
sudo yum install pkgconfig.x86_64

Debain 9 安裝

1
2
3
4
5
6
7
sudo mount -t iso9660 -o loop /iso/debian-9.0.0-amd64-DVD-1.iso /media/cdrom
sudo vi /etc/apt/sources.list
deb file:/media/cdrom stretch main cntrib
sudo apt-get install build-essential

#https://packages.debian.org/sid/amd64/bcache-tools/download
sudo dpkg -i bcache-tools_1.0.8-2+b1_amd64.deb

<當出現 Possible missing firmware 的時候,因為套件沒安裝的關係,所以必需另外安裝>


1
2
3
4
5
# https://packages.debian.org/stretch/firmware-linux-nonfree

sudo dpkg -i firmware-amd-graphics_20161130-3_all.deb
sudo dpkg -i firmware-misc-nonfree_20161130-3_all.deb
sudo dpkg -i firmware-linux-nonfree_20161130-3_all.deb

Step 2. 準備SATA & SSD 空間

刻意不將全部的/dev/sda 切出來,就是留給做bcache。

  1. fdisk /dev/sda 將剩下的空間給 /dev/sda5,/dev/sda6

    1
    fdisk /dev/sda

    ![]å(https://d2mxuefqeaa7sj.cloudfront.net/s_3C81AF9116B1BE2B1087F3787CEF9E0E94ABD34998A731A0AB40DD4BEFDB8E4C_1508812471074_image.png)

  2. fdisk 後需要重新開機 確定 /dev 下 有sda6

  3. 設定 SATA

    1
    sudo make-bcache -B /dev/sda6

  4. 設定 SSD

    參考網路上的設定,大約有三種,我採用第三種。

    1
    sudo make-bcache -C /dev/sdb -B /dev/sda6 
    1
    2
    3
    # 其中 —discard 是開啟 SSD的 TRIS,--writeback 是 cache 的讀寫模式

    sudo make-bcache -C /dev/sdb -B /dev/sda6 --discard --writeback
    1
    2
    3
    # 再加上設定 block bucket

    sudo make-bcache --block 4k --bucket 2M -C /dev/sdb -B /dev/sda5 /dev/sda6 --discard --writeback

    再利用 lsblk 指令就可以看到調整後的樹狀結構

    若遇到問題可以試著清硬碟看看

    1
    2
    wipefs -a /dev/sdb 
    wipefs -a /dev/sda

    但有時候會遇到 Can’t open dev /dev/sdb: Device or resource busy,就需要查找誰佔著資源不放了。
    就經驗來看, sudo lsof /dev/sdb 會找不到有什麼程序佔著了,重開機就可以了。

  5. 格式化 /dev/bcache0

    1
    2
    sudo mkfs.xfs /dev/bcache0
    sudo mkfs.xfs /dev/bcache1

Step 3. 掛載&註冊 Bcache 空間

  1. 掛載 bcache

    1
    2
    sudo mkdir /bcache
    sudo mount /dev/bcache0 /bcache
  1. 找到裝置的UUID

    1
    ls -la /sys/fs/bcache/

  2. 註冊

    這個 cache-set-uuid 是 SET UUID
    如果有二個bcache(bcache0, bcache1) 就用做二次。

    1
    2
    3
    #SET UUID 都一樣
    echo 74d15d2xxxxxxxxx >/sys/block/bache0/bcache/attach
    echo 74d15d2xxxxxxxxx >/sys/block/bache1/bcache/attach

  3. 掛載 fstab (要先copy 一份fstab 備份 cp /etc/fstab /etc/fstab.bak)

    1
    2
    sudo blkid /dev/bcache0 #查UUID
    sudo blkid /dev/bcache1 #查UUID

    最後寫入 /etc/fstab

    做完建議先重新開機看看有沒有問題。

Step 4. 停止 Bcache 的方法

停止 bcache 的方法。

1
2
3
echo 1 > /sys/fs/bcache/add98ca3-d397-4e26-bf3c-fb3c46d13930/stop
wipefs -a /dev/sdb
echo 1 > /sys/block/sda/sda6/bcache/stop


問題

1. 如果使用 git source compiler 可能會遇到的問題。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Don't inline crc64 for gcc-5 compatability

This patch is backported from Debian and it fixes the following error:

bcache.c:125:9: warning: 'crc_table' is static but used in inline
function 'crc64' which is not static
...
make-bcache.c:277: undefined reference to `crc64'

Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>

From: David Mohr <david@mcbf.net>
Date: Tue, 26 May 2015 20:34:31 -0600
Subject: Don't inline crc64 for gcc-5 compatability

Forwarded: http://article.gmane.org/gmane.linux.kernel.bcache.devel/2919

By James Cowgill, see Debian bug #777798
---
bcache.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bcache.c b/bcache.c
index 8f37445..8b4b986 100644
--- a/bcache.c
+++ b/bcache.c
@@ -115,7 +115,7 @@ static const uint64_t crc_table[256] = {
0x9AFCE626CE85B507ULL
};

-inline uint64_t crc64(const void *_data, size_t len)
+uint64_t crc64(const void *_data, size_t len)
{
uint64_t crc = 0xFFFFFFFFFFFFFFFFULL;
const unsigned char *data = _data;


make
sudo make install
lsblk #先看磁碟結構

https://www.dropbox.com/s/w50mrmdy875ss51/dm-cache.pdf?dl=0

2. Redhat 7 遇到的問題是 無法產生相對應的文件點位 /sys/fs/bcache/register

網路上有找到有人有遇到相同的問題

1
2
# kernel - 3.10.0-514.el7.x86_64
# bcache是在3.10以后的版本加入mainline的,因此需要3.10以上的内核版本。但是笔者使用Centos 7在3.10.0的内核上进行配置时,发现无法生成相应的配置文件节点,[**测试**](http://lib.csdn.net/base/softwaretest)过程中使用4.3.3版的内核

參考資料