bcache狀態和配置檔案詳細介紹(翻譯自官網)
阿新 • • 發佈:2019-02-01
參考文獻
宣告:
什麼是bcache
bcache是linux核心塊層cache.它使用類似SSD來作為HDD硬碟的cache,從而起到加速作用。 HDD硬碟便宜並且空間更大,SSD速度快但更貴。如果能兩者兼得,豈不快哉?bcache能做到。
bcache使用SSD作為其他塊裝置的cache.類似ZFS的L2Arc,但bcache還增加了寫回策略,並且是與檔案系統無關的。bcache被設計成只需要最小的代價,無需配置就能在所有環境中工作。預設狀態下bcache不快取順序IO,只快取隨機讀寫。
bcache適用於桌面、伺服器,高階儲存陣列,甚至是嵌入式環境。設計bcache目標是讓被快取裝置(HDD等塊裝置)與SSD一樣快(包括快取命中、快取不命中、透寫和回寫) 。現在還未達到初衷,特別是順序寫。同時測試結果表明離目標很接近,甚至有些情況下表現更好,例如隨機寫。
bcache是資料安全的。對於寫回策略快取來說,可靠性是非常重要的,出錯就意味著丟失資料。bcache是用電池備份陣列控制器的替代選擇,同時也要求bcache在異常掉電時也是資料安全的。對於寫而言,必須在所有資料寫到可靠介質之後才能向上層返回寫成功。如果在寫一個大檔案時掉電了,則寫入是失敗的。異常掉電資料安全是指
cache 中的髒資料是不會丟的,不像記憶體中的髒資料掉電就沒了。
bcache效能設計目標是等同於SSD.最大程度上去最小化寫放大,並避免隨機寫。bcache將隨機寫轉換為順序寫 ,首先寫到SSD,然後回寫快取使用SSD快取大量的寫,最後將寫有序寫到磁碟或者陣列上。對於RAID6陣列,隨機寫效能很差,還要花費不菲的價格購買帶有電池保護的陣列控制器。現在有了bcache,你就可以直接使用linux自帶的優秀軟RAID,甚至可以在更廉價的硬體上獲取更高的隨機寫效能。
特性:
1、一個快取裝置可以作為多個裝置的快取,並且可以在裝置執行時動態新增和刪除快取。
2、只有當寫到磁碟後快取才會確認寫完成。
3、正確處理寫阻塞和刷快取
4、支援writethrough, writeback和writearound等寫快取模式
5、檢測並避開順序IO(可配置關閉該選項)
6、當檢測到SSD延遲超過配置邊界值,減少到SSD流量 (當一個SSD作為多個磁碟快取時使用)
7、快取不命中時預讀(預設關閉)
8、高效能的 writeback 實現:髒資料都是排序後再回寫。如果設定了
writeback 水位線,PD控制器會根據髒資料比例來平滑處理到後臺的writeback流量。
9、使用高效率的B+樹,bcache隨機讀可以達到1M IOPS
10、穩定
============================A block layer cache (bcache)============================
假如你有一個大而慢的raid 6和一塊SSD(或者3塊), 如果你用它們做快取,這並不是好事……但是你可以使用bcache
Wiki和git倉庫在:
- http://bcache.evilpiepirate.org - http://evilpiepirate.org/git/linux-bcache.git - http://evilpiepirate.org/git/bcache-tools.git
bcache針對SSD的效能測試設計--它僅分配可擦寫塊(erase block size)的bucket,使用混合bree/log去追蹤快取內容(從單個扇區到bucket大小的任何地方),它以不惜任何代價來設計避免隨機寫;它順序地填滿一個個可擦寫塊(erase block),
然後在重用該塊之前清除該塊。
支援writethrough和writeback快取模式。writeback預設關閉,但可以在執行時隨時開啟或關閉。bcache竭盡全力來保護你的資料--它可靠地處理unclean的關閉。(甚至根本就沒有clean shutdown的概念,因為資料寫到可靠的磁碟,完成之前不會返回)。
writeback快取能用於絕大部分buffering write的快取--總是順序地write髒資料到後端裝置,從index的起始到末尾掃描。
SSD擅長隨機IO,通常對快取大序列化IO,沒有優化空間,Bcache會探測順序IO並跳過它,SSD只優化隨機IO。bcache也會對每次task中的IO size的平均大小持續跟蹤,只要平均大小超過cutoff,它將會跳過該task中的所有IO,而非在每次查詢後快取前512K位元組,備份和大檔案複製會整個跳過快取裝置。
當flash快閃記憶體上發生data IO error時,它會盡量從磁碟讀取資料來恢復,恢復失敗就使快取物件失效。對不可恢復的錯誤(元資料或髒資料),caching裝置會自動禁用;假如caching裝置中有髒資料存在,首先會禁用writeback,等所有的髒資料都寫到磁盤裡。
開始使用
你需要使用bcache-tools程式碼庫中的make-bcache,在使用之前,cache裝置和backing裝置都必須格式化:
make-bcache -B /dev/sdb make-bcache -C /dev/sdc
make-bcache可以同時格式化多個裝置,假如你同時格式化後端裝置和快取裝置,無須手動繫結
make-bcache -B /dev/sda /dev/sdb -C /dev/sdc
bcache-tools現在加入了udev rules,bcache裝置能立即被核心探測到,如果沒有udev,你需要手動這樣註冊
echo /dev/sdb > /sys/fs/bcache/register echo /dev/sdc > /sys/fs/bcache/register
註冊後端裝置將可在/dev中看到bcache,然後你可以格式化它,之後可以像普通磁碟一樣使用。
但是,第一次使用全新的bcache裝置,它通常會執行在passthrough模式(所有讀寫操作都到硬碟上)下面,直到你將它繫結到一臺快取裝置。如果你想以後使用bcache,推薦你搭建所有的慢速裝置為bcache的後端裝置,不帶caching裝置,你能在以後選擇追加一臺caching裝置。參見下面的“繫結”小節。
裝置實現如下:
/dev/bcache<N>
以及(和udev)
/dev/bcache/by-uuid/<uuid> /dev/bcache/by-label/<label>
開始格式化為指定的檔案系統,並mount到檔案樹上
mkfs.ext4 /dev/bcache0 mount /dev/bcache0 /mnt
你可以在/sys/block/bcache<N>/bcache通過sysfs控制bcache裝置,
你也能通過/sys/fs/bcache/<cset-uuid>/控制它們。
快取裝置作為集合set來管理,每個set中多個快取裝置目前仍然不支援,但是將來會允許元資料和髒資料的映象。新cache set將在/sys/fs/bcache/<UUID>中顯示。
繫結
當快取裝置和後端設備註冊後,後端裝置必須繫結到cache set中來實現快取,因此,使用cache set在目錄/sys/fs/bcache中的UUID,來將後端裝置繫結到cache裝置上:
echo <CSET-UUID> > /sys/block/bcache0/bcache/attach
這隻需要做一次。下次機器重啟,只需要重新註冊所有的bcache裝置就可以了。假如後端裝置在cache中其它地方有資料,/dev/bcache<N>裝置不會建立成功,直至cache show up。假如你打開了writeback模式,這非常重要。
重啟之後,快取裝置找不見了,一直沒有恢復,你可以強制執行後端裝置:
echo 1 > /sys/block/sdb/bcache/running
(你需要使用/sys/block/sdb或任何被呼叫的後端裝置,非/sys/block/bcache0,因為bcache0還不存在,假如你使用到分割槽,bcache目錄可能是/sys/block/sdb/sdb2/bcache)
假如後端裝置以後起來之後,它仍舊會用到cache set,但是所有的快取資料都是非法的。
假如快取中有髒資料,別指望檔案系統能自動修復--你將有大量的檔案系統損壞,雖然ext4的fsc可以產生奇蹟。
錯誤處理
Bcache嘗試透明地處理來自快取裝置的 IO 錯誤,而不會影響正常操作;如果它看到太多錯誤(閾值可配置,並且預設為0),它將關閉快取裝置並將所有 backing device 切換到 passthrough 模式。
- 對於從快取讀取,如果它們出現錯誤,將從 backing device 重新嘗試讀取
- 對於 writethroungh writes,如果寫入快取錯誤,我們只需切換到快取中的 lba(Logical Block Address, LBA) 上使資料無效(即我們為繞過 cache write 將資料寫到後端裝置)
- For writethrough writes, if the write to the cache errors we just switch to invalidating the data at that lba in the cache (i.e. the same thing we do for a write that bypasses the cache)
- 對於writeback writes,我們目前將該錯誤傳遞給檔案系統/使用者空間。這可以改進 - 我們可以嘗試繞過快取的寫入,所以小心避免寫入錯誤。
- 對於分離操作,我們首先嚐試重新整理任何髒資料到後端裝置(如果我們以 writeback 模式執行)。但是,如果它無法讀取髒資料,當前它將不會做任何操作。
- no cache:還未附加到快取集(cache set)。
- clean:快取集的一部分,且 cache 沒有髒資料。
- dirty:快取集的一部分,且 cache 有髒資料。
- inconsistent:不一致,當 cache 中存在髒資料但快取集不可用時,backing device 被使用者強制執行;backing device 上的任何資料可能已損壞了