在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