智匯華云 | bcache原理及實踐

轉(zhuǎn)載 網(wǎng)絡(luò)轉(zhuǎn)載 | 2022年05月13日
智匯華云 | bcache原理及實踐 ......

一、前言

簡單介紹下bcache,bcache是linux內(nèi)核塊設(shè)備層的cache。主要是使用SSD盤在IO速度較慢的HDD盤上面做一層緩存,從而來提高HDD盤的IO速率。一個緩存設(shè)備(SSD)可以同時為多個后端設(shè)備(HDD)提供緩存。既然是緩存,那自然就會想到緩存策略,bcache支持三種緩存策略:

writeback:回寫策略,所有的數(shù)據(jù)將先寫入緩存盤,然后等待系統(tǒng)將數(shù)據(jù)回寫入后端數(shù)據(jù)盤中。

writethrough:直寫策略(默認策略),數(shù)據(jù)將會同時寫入緩存盤和后端數(shù)據(jù)盤。

writearoud:數(shù)據(jù)將直接寫入后端磁盤。

Write-misses寫缺失(寫入的數(shù)據(jù)不在緩存中)有兩種處理方式:

Write allocate方式將寫入位置讀入緩存,然后采用write-hit(緩存命中寫入)操作。寫缺失操作與讀缺失操作類似。

No-write allocate方式并不將寫入位置讀入緩存,而是直接將數(shù)據(jù)寫入存儲。這種方式下,只有讀操作會被緩存。

無論是Write-through還是Write-back都可以使用寫缺失的兩種方式之一。只是通常Write-back采用Write allocate方式,而Write-through采用No-write allocate方式;因為多次寫入同一緩存時,Write allocate配合Write-back可以提升性能;而對于Write-through則沒有幫助。

處理流程圖:

A Write-Through cache with No-Write Allocation:

A Write-Back cache with Write Allocation:

bcache比較靈活,緩存策略可以隨時修改,也可以針對不同的bcache設(shè)備設(shè)置不同的緩存策略。以下會按照安裝、配置和使用這幾個部分來說明具體使用bcache的過程。bcache可以大概分為兩個部分,一個是linux內(nèi)核模塊,一個是bcache-tools,bcache內(nèi)核模塊在linux內(nèi)核3.10及以上才支持,所以使用bcache,需要將內(nèi)核升級到3.10及以上版本才行

二、幾種緩存模式

下面簡單介紹下三種模式的區(qū)別:

Write-through 同時寫入到SSD和HDD,并在SSD和HDD都寫成功后再返回成功。 Write-back 先寫入到SSD,并返回成功,之后再后臺同步到HDD。會帶來一些穩(wěn)定性風(fēng)險。 Write-around 直接寫入到HDD。 具體選擇哪種模式,取決于業(yè)務(wù)對磁盤的使用方式。

以下是幾種常見的決策方式:

如果對穩(wěn)定性要求不高,但是對性能比較敏感,則應(yīng)選擇 Write-back,因其性能最高。 如果對穩(wěn)定性有要求,則: 若是預(yù)期剛寫入的數(shù)據(jù)會被較快重新讀,則應(yīng)使用Write-through,它在寫入數(shù)據(jù)的同時,會在SSD上建立讀緩存,后續(xù)讀的時候速度會比較快。 若是很少讀之前寫入的數(shù)據(jù),則應(yīng)使用Write-around,一方面能加快寫入速度(只用寫一份),另一方面也避免了無效數(shù)據(jù)沖刷緩存。

官網(wǎng)說bcache的性能完全優(yōu)于flashcache,參考:

http://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/

官網(wǎng)介紹:

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

https://bcache.evilpiepirate.org/

bcache-tools 源碼:

https://evilpiepirate.org/git/bcache-tools.git

(一)、升級內(nèi)核

1、官網(wǎng)下載內(nèi)核

http://cdn.kernel.org/pub/linux/kernel/

注意:編譯前修改.config文件開啟CONFIG_BCACHE

CONFIG_BCACHE=y

2、編譯內(nèi)核

過程忽略

3、安裝內(nèi)核

#rpm-ivhkernel-4.18.20-1.x86_64.rpm--force

4、生成grub

# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg

5、重啟

# reboot

6、加載內(nèi)核

# modprobe bcache

# lsmod | grep bcache

(二)、安裝bcache-tools

1、安裝依賴libblkid-devel和gcc

# yum install libblkid-devel gcc -y

2、下載bcache-tools源碼 下載鏈接為

https://github.com/g2p/bcache-tools/releases。

3、解壓包

# tar -zxvf bcache-tools-1.0.8.tar.gz

# cd /root/bcache-tools-1.0.8

4、安裝

# make

# make install

注意:如果是ubuntu環(huán)境可以直接安裝

#apt-getinstallbcache-tools

(三)、創(chuàng)建bcache設(shè)備

1、創(chuàng)建后端低速設(shè)備(一般是HDD、SATA盤等)

# make-bcache -B /dev/sdc

UUID:1eca911e-c9c9-4d9b-84c0-c1da023574ed

Set UUID:5cf29253-f347-435e-a3db-b99006c8e6e0

version:1

block_size:1

data_offset:16

可以看到,在sdb(HDD)磁盤下,出現(xiàn)了bcache0節(jié)點,這個bcache0可以理解為就是/dev/sdb磁盤了

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

└─bcache0 252:0 0 200G 0 disk

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

對bcache0進行格式化操作了。

# mkfs.xfs /dev/bcache0

meta-data=/dev/bcache0 isize=256 agcount=4, agsize=1310720 blks

= sectsz=512 attr=2, projid32bit=1

= crc=0 finobt=0

data = bsize=4096 blocks=5242878, imaxpct=25

= sunit=0 swidth=0 blks

naming =version 2 bsize=4096 ascii-ci=0 ftype=0

log =internal log bsize=4096 blocks=2560, version=2

= sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

掛載目錄

# mkdir /wyl

# mount /dev/bcache0 /wyl

# df -h

Filesystem Size Used Avail Use% Mounted on

devtmpfs 2.0G 0 2.0G 0% /dev

tmpfs 2.0G 0 2.0G 0% /dev/shm

tmpfs 2.0G 8.6M 2.0G 1% /run

tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup

/dev/mapper/centos-root 18G 1.6G 16G 9% /

/dev/sda1 497M 170M 328M 35% /boot

tmpfs 394M 0 394M 0% /run/user/0

/dev/bcache0 20G 33M 20G 1% /wyl

2、創(chuàng)建前端緩存磁盤(SSD)

# make-bcache -C /dev/sdb

UUID:51d3daf3-ca90-4bf7-9499-79b98321c43a

Set UUID:f43c7118-4595-49cf-a17c-1965ee939b4b

version:0

nbuckets:163840

block_size:1

bucket_size:1024

nr_in_set:1

nr_this_dev:0

first_bucket:1

建立映射關(guān)系 把我們創(chuàng)建好的后端低速設(shè)備和前端高速設(shè)備建立聯(lián)系,這樣高速設(shè)備才能為低速設(shè)備提供緩存作用。

首先需要獲取該緩存盤(/dev/sdb)的cset.uuid,通過bcache-super-show命令查看:

# bcache-super-show /dev/sdb

sb.magicok

sb.first_sector8 [match]

sb.csumAD0668369D7EED63 [match]

sb.version3 [cache device]

dev.label(empty)

dev.uuid51d3daf3-ca90-4bf7-9499-79b98321c43a

dev.sectors_per_block1

dev.sectors_per_bucket1024

dev.cache.first_sector1024

dev.cache.cache_sectors167771136

dev.cache.total_sectors167772160

dev.cache.orderedyes

dev.cache.discardno

dev.cache.pos0

dev.cache.replacement0 [lru]

cset.uuidf43c7118-4595-49cf-a17c-1965ee939b4b

備建立聯(lián)

#echo "f43c7118-4595-49cf-a17c-1965ee939b4b" > /sys/block/bcache0/bcache/attach

操作完成后,可以通過lsblk命令查看結(jié)果

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

└─bcache0 252:0 0 200G 0 disk /wyl

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

└─bcache0 252:0 0 200G 0 disk /wyl

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

三、快速配置方式

上面我們配置大概分了三個步驟:創(chuàng)建后端設(shè)備、創(chuàng)建前端緩存設(shè)備、建立他們之間的映射關(guān)系。

1、快速創(chuàng)建

# make-bcache-C /dev/sdb -B/dev/sdc

2、查看

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

└─bcache0 252:0 0 200G 0 disk /wyl

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

└─bcache0 252:0 0 200G 0 disk /wyl

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

3、同樣支持多個后端設(shè)備

# make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd

四、高級功能

1、指定塊大小 在make-bcache的時候加入-w和-b參數(shù),主要是提高緩存性能

-wblocksize 默認2K,一般需要blocksize = 后端設(shè)備的扇區(qū)大小。

-b bucketsize,一般需要bucketsize = 前端緩存設(shè)備的eraseblocksize大小。

2、修改緩存策略 查看緩存策略,可以看到默認的策略是writethrough,也就是直寫模式

# cat /sys/block/bcache0/bcache/cache_mode

[writethrough] writeback writearound none

修改緩存策略

#echo writeback > /sys/block/bcache0/bcache/cache_mode

然后查看是否生效

# cat /sys/block/bcache0/bcache/cache_mode

writethrough [writeback] writearound none

注:就算機器重啟之后緩存策略也不會失效的。

3、查看緩存 確認所有的東西都已經(jīng)正確地配置了:

# cat /sys/block/bcache0/bcache/state

輸出的內(nèi)容有以下可能:

no cache: 這代表你還沒有綁定緩存設(shè)備到你的后端設(shè)備上

clean: 這代表一切正常,緩存是clean的

dirty: 這代表一切正常,緩存模式被設(shè)置成了writeback,緩存是dirty的

inconsistent: 這代表問題很大,后端設(shè)備與緩存設(shè)備沒有同步使用一個沒有緩存設(shè)備的 /dev/bcache0 的話所有的IO都會直接在后端設(shè)備上執(zhí)行,等于pass-through模式。

4.IO路徑跟蹤

bcache會跟蹤每個IO,如果IO的時間超過閾值,則旁路cache設(shè)備,直接讀寫backing設(shè)備。

如果你的SSD足夠強大,可以不跟蹤,減少跟蹤的開銷。

# echo 0 > /sys/fs/bcache//congested_read_threshold_us

# echo 0 > /sys/fs/bcache//congested_write_threshold_us

關(guān)閉旁路的另一個好處是,所有的離散讀寫都會經(jīng)過cache設(shè)備,從而不會導(dǎo)致cache missing。

默認情況下當(dāng)讀請求超過2ms,寫請求超過20ms時,旁路cache設(shè)備。

The default is 2000 us (2 milliseconds)forreads,and20000forwrites.

5.將順序IO也命中到cache中 打開順序IO緩存:

#echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

設(shè)置回默認值:

#echo 4194304 > /sys/block/bcache0/bcache/sequential_cutoff

五、刪除bcache

1、解除緩存盤和后端盤關(guān)系

要將緩存盤從當(dāng)前的后端磁盤刪除,只需將緩存盤的cset.uuid detach到bcache設(shè)備即可實現(xiàn)

查看ssd的cset.uuid

# bcache-super-show /dev/sdb | grep cset.uuid

cset.uuidf43c7118-4595-49cf-a17c-1965ee939b4b

解除綁定

# echo f43c7118-4595-49cf-a17c-1965ee939b4b > /sys/block/bcache0/bcache/detach

查看結(jié)果

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

└─bcache0 252:0 0 200G 0 disk

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

可以看到sdb下面已經(jīng)沒有bcache0了。

2、刪除后端盤

# umount /wyl/

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

# echo 1 >/sys/fs/bcache/f43c7118-4595-49cf-a17c-1965ee939b4b/unregister

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

└─bcache0 252:0 0 200G 0 disk

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

3、驗證

# lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdb 8:16 0 80G 0 disk

sr0 11:0 1 1024M 0 rom

fd0 2:0 1 4K 0 disk

sdc 8:32 0 200G 0 disk

sda 8:0 0 80G 0 disk

├─sda2 8:2 0 79G 0 part

│ ├─centos-swap 253:1 0 4G 0 lvm [SWAP]

│ └─centos-root 253:0 0 75G 0 lvm /

└─sda1 8:1 0 1G 0 part /boot

4、格式化磁盤

# mkfs.xfs /dev/sdb -f

# mkfs.xfs /dev/sdc -f

六、遇到的問題

1、擦除磁盤中的超級塊中的數(shù)據(jù)

用磁盤作為Bcache磁盤前,請先確保磁盤是空的,或者磁盤中的數(shù)據(jù)無關(guān)緊要。如果磁盤中有文件系統(tǒng),將會出現(xiàn)如下錯誤:

# make-bcache -C /dev/sdc

Device /dev/sdc already hasanon-bcache superblock, removeitusingwipefsandwipefs -a

擦除磁盤中的超級塊信息:

# wipefs -a /dev/sdc

/dev/sdc: 2byteswere erasedatoffset 0x00000438 (ext4): 53 ef

2、如果使用make-bcache命令出現(xiàn)了如下打印,那就說明當(dāng)前磁盤已經(jīng)是bcache磁盤,

# make-bcache -B /dev/sdb

Already a bcache deviceon/dev/sdb, overwritewith--wipe-bcache

加上 --wipe-bcache參數(shù)就可以了:

# make-bcache-B/dev/sdb --wipe-bcache

3、設(shè)備處于繁忙中

# make-bcache -C /dev/sdf -B /dev/sdc

Can't open dev /dev/sdf: Device or resource busy

這時候應(yīng)該可以看到這個lv的superblock還有信息,這就是原因.

# bcache-super-show /dev/sdf

# wipefs -af /dev/sdf

# dd if=/dev/zero of=/dev/sdf bs=1M count=512

# reboot

標簽:智匯華云

用戶名:  密碼:  沒有注冊?
網(wǎng)友評論:(請各位網(wǎng)友遵紀守法并注意語言文明,評論僅供參考不代表本站立場)