1 Bcache介紹
Bcache是一種緩存技術,它是根據SSD的特性設計的,因爲SSD的隨機讀寫速度要比普通硬盤的隨機讀寫快N多倍,可是通常SSD的容量小且貴,固然土豪除外,因此咱們能夠綜合SSD的讀寫速度快和HDD的容量大的優勢,這就可使用bcache來作到,將SSD做爲HDD的緩存磁盤,,即保證了讀寫速度,又省了一大筆資金,何樂不爲。html
2 使用Bcache的工做準備
因爲bcache是在kernel 3.10以後才加上的,因此須要確保你的內核是3.10以上的,可使用命令uname -a查看你的內核版本:node
[root@localhost ~]# uname -a Linux thinstack-qtGr8j 3.10.0-514.26.2.el7.x86_64 #1 SMP Fri Jun 22 18:59:37 CST 2018 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內核。linux
內核中有bcache模塊後,要使用bcache還須要一個工具:bcache-tools,它提供了make-bcache工具, centos源上是沒有這個rpm包的,須要本身下載源碼而後進行編譯,在進行編譯前須要下載幾個依賴包:git
yum install pkgconfig libblkid-devel
下載rpm的一些打包工具包:github
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/目錄下:centos
tar -zcvf ~/rpmbuild/SOURCES/bcache-tools-1.0.8.tar.gz bcache-tools-1.0.8
將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包。bash
3 使用Bcache
3.1 添加緩存磁盤操做
首先選擇一個SSD盤做爲緩存磁盤,固然若是隻是測試,那麼選擇一個普通硬盤來作也是能夠的,假設選擇的盤是/dev/sdb,則使用命令來建立緩存盤:tcp
[root@localhost ~]# make-bcache -C /dev/sdb UUID: 60a170c4-fde4-40af-aa1c-97ed79139699 Set UUID: b69c5773-c8a9-49b1-89cc-e0638652977c version: 0 nbuckets: 65536 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1
選擇一個普通硬盤做爲緩存磁盤的後端磁盤,這裏假設選擇的盤是/dev/sdc,則使用命令來建立後端磁盤:
[root@localhost ~]# make-bcache -B /dev/sdc UUID: cbad64dd-6717-49b5-b22c-e006ab7cdb0c Set UUID: a9bf6ced-10e1-4101-a80f-f2b7efc45ff3 version: 1 block_size: 1 data_offset: 16
使用lsblk查看磁盤狀態,能夠看到後端磁盤已經有一個bcache0,同時存在設備/dev/bcache0:
[root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 18.8G 0 part / sdb 8:16 0 32G 0 disk sdc 8:32 0 32G 0 disk └─bcache0 252:0 0 32G 0 disk
但這時還需將bcache0綁定到緩存磁盤中,首先查找緩存盤的uuid:
[root@localhost ~]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum F4550D6F828E6162 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 60a170c4-fde4-40af-aa1c-97ed79139699 dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 67107840 dev.cache.total_sectors 67108864 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [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 8:0 0 20G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 18.8G 0 part / sdb 8:16 0 32G 0 disk └─bcache0 252:0 0 32G 0 disk sdc 8:32 0 32G 0 disk └─bcache0 252:0 0 32G 0 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 2>&1 exit 0
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