參考文獻
宣告:
什麼是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 模式執行)。但是,如果它無法讀取髒資料,當前它將不會做任何操作。
奇技淫巧Howto/cookbook
A)從一個丟失的caching裝置啟動bcache
假如註冊後端裝置毫無幫助,事已至此,你只需強制它在無cache裝置的情況下執行
host:~# echo /dev/sdb1 > /sys/fs/bcache/register[ 119.844831] bcache: register_bcache() error opening /dev/sdb1: device already registered
下一步,如果有cache裝置的話,你儘量註冊它,然而假如沒有,或是cache裝置因為某種原因註冊失敗,在沒有cache裝置的情況下,你仍然能夠啟動bcache,像下面這樣
host:/sys/block/sdb/sdb1/bcache# echo 1 > running
注意如果當前在writeback模式下,這會導致資料丟失。
B)bcache找不到cache
host:/sys/block/md5/bcache# echo 0226553a-37cf-41d5-b3ce-8b1e944543a8 > attach[ 1933.455082] bcache: bch_cached_dev_attach() Couldn't find uuid for md5 in set[ 1933.478179] bcache: __cached_dev_store() Can't attach 0226553a-37cf-41d5-b3ce-8b1e944543a8[ 1933.478179] : cache set not found
這種情況,cache裝置可能在系統啟動時沒有註冊,或是消失後又回來了,需要再次註冊一下
host:/sys/block/md5/bcache# echo /dev/sdh2 > /sys/fs/bcache/register
C)損壞的bcache在設備註冊期間將kernel搞崩潰
這不會發生,如果真發生了,那就是bug!請報告給bcache開發小組:
務必提供更多的資訊,包括kernel dmesg輸出,以便我們可以參考
D)沒有bcache的情況下恢復資料
假如kernel中找不到bcache模組,後端裝置的filesystem仍然可以在8KB偏移處找到。所以,要麼通過後端裝置的loopdev,使用--offset 8K生成的,或者是,當你最初使用make-cache來格式化bache時,--data-offset定義的其它值
比如:
losetup -o 8192 /dev/loop0 /dev/your_bcache_backing_dev
這應該會將後端裝置中的資料原封不動地複製到/dev/loop0中。
如果你的快取是在writethrough模式下,你可以安全地扔掉cache裝置了,此時不會丟失任何資料。
E)擦除快取裝置
::host:~# wipefs -a /dev/sdh216 bytes were erased at offset 0x1018 (bcache)they were: c6 85 73 f6 4e 1a 45 ca 82 65 f5 7f 48 ba 6d 81
在重啟系統後,開啟bcache,重建cache裝置並開啟它:
host:~# make-bcache -C /dev/sdh2UUID: 7be7e175-8f4c-4f99-94b2-9c904d227045Set UUID: 5bc072a8-ab17-446d-9744-e247949913c1version: 0nbuckets: 106874block_size: 1bucket_size: 1024nr_in_set: 1nr_this_dev: 0first_bucket: 1[ 650.511912] bcache: run_cache_set() invalidating existing data[ 650.549228] bcache: register_cache() registered cache device sdh2
在無cache的情況下,開啟後端裝置
host:/sys/block/md5/bcache# echo 1 > running
繫結新cache裝置
host:/sys/block/md5/bcache# echo 5bc072a8-ab17-446d-9744-e247949913c1 > attach[ 865.276616] bcache: bch_cached_dev_attach() Caching md5 as bcache0 on set 5bc072a8-ab17-446d-9744-e247949913c1
F)移除或是替換快取裝置
host:/sys/block/sda/sda7/bcache# echo 1 > detach[ 695.872542] bcache: cached_dev_detach_finish() Caching disabled for sda7host:~# wipefs -a /dev/nvme0n1p4wipefs: error: /dev/nvme0n1p4: probing initialization failed: Device or resource busyOoops, it's disabled, but not unregistered, so it's still protected我們需要取消註冊host:/sys/fs/bcache/b7ba27a1-2398-4649-8ae3-0959f57ba128# ls -l cache0lrwxrwxrwx 1 root root 0 Feb 25 18:33 cache0 -> ../../../devices/pci0000:00/0000:00:1d.0/0000:70:00.0/nvme/nvme0/nvme0n1/nvme0n1p4/bcache/host:/sys/fs/bcache/b7ba27a1-2398-4649-8ae3-0959f57ba128# echo 1 > stopkernel: [ 917.041908] bcache: cache_set_free() Cache set b7ba27a1-2398-4649-8ae3-0959f57ba128 unregistered現在我們才能清除資料host:~# wipefs -a /dev/nvme0n1p4/dev/nvme0n1p4: 16 bytes were erased at offset 0x00001018 (bcache): c6 85 73 f6 4e 1a 45 ca 82 65 f5 7f 48 ba 6d 81
G)dm-crypt和bcache
首先搭建非加密的bcache,然後在/dev/bcache<N>上層安裝dmcrypt,這會更快,假如你dmcrypt後端和caching裝置的時候,同時在頂層安裝bcache。[需要benchmarks?]
H)停止並釋放一個註冊過的bcache,擦除之後重新生成
假如你需要釋放所有的bcache引用,以便你能執行fdisk並重新註冊一個變動的分割槽表,假如上面有任何活躍的backing或是caching裝置,這都不會成功
1)/dev/bcache*有東西嗎?(有時沒有)
假如存在,很簡單:
host:/sys/block/bcache0/bcache# echo 1 > stop
2)但是假如你的後端裝置不在,這不會成功:
host:/sys/block/bcache0# cd bcachebash: cd: bcache: No such file or directory
這種情況,你或許必須登出引用該待釋放bcache的dmcrypt的塊裝置
host:~# dmsetup remove oldds1bcache: bcache_device_free() bcache0 stoppedbcache: cache_set_free() Cache set 5bc072a8-ab17-446d-9744-e247949913c1 unregistered
這導致後端bcache從/sys/fs/bcache中移除,然後再次重用,This would be true of any block device stacking where bcache is a lower device.
3)另一方面,你也能看看/sys/fs/bcache/
host:/sys/fs/bcache# ls -l */{cache?,bdev?}lrwxrwxrwx 1 root root 0 Mar 5 09:39 0226553a-37cf-41d5-b3ce-8b1e944543a8/bdev1 -> ../../../devices/virtual/block/dm-1/bcache/lrwxrwxrwx 1 root root 0 Mar 5 09:39 0226553a-37cf-41d5-b3ce-8b1e944543a8/cache0 -> ../../../devices/virtual/block/dm-4/bcache/lrwxrwxrwx 1 root root 0 Mar 5 09:39 5bc072a8-ab17-446d-9744-e247949913c1/cache0 -> ../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/ata10/host9/target9:0:0/9:0:0:0/block/sdl/sdl2/bcache/
裝置名將顯示哪個UUID是相關的,在該目錄下cd,然後stop the cache:
host:/sys/fs/bcache/5bc072a8-ab17-446d-9744-e247949913c1# echo 1 > stop
這將會釋放bcache引用,讓你重用其它目的的分割槽
效能調優
Bcache 有一堆配置選項和可調引數,預設引數對於典型的桌面和伺服器工作負載是合理的,但是,當您在基準測試時,它們不是你想要獲得的最佳引數
- Backing device 對齊
bcache中的預設(metadata)元資料大小為8k.如果你的 Backing device 是基於 RAID 的,那麼請務必使用`make-bcache --data-offset`將其與你的 RAID 條帶大小對齊(即設定為 raid 條帶大小的倍數)。--可避免寫放大。如果考慮未來RAID的擴充套件,則用RAID條帶大小乘以一序列素數,來得到你想要的磁碟倍數,建議這樣計算data-offset的值
   For example:  If you have a 64k stripe size, then the following offset
   would provide alignment for many common RAID5 data spindle counts:
    64k * 2*2*2*3*3*5*7 bytes = 161280k
   That space is wasted, but for only 157.5MB you can grow your RAID 5
   volume to the following data-spindle counts without re-aligning:
    3,4,5,6,7,8,9,10,12,14,15,18,20,21 ...
- 寫入效能差
 假如寫入效能不達預期,你或許想執行在writeback模式下面,這並非預設的模式。(writeback模式之所以不是預設模式,不是因為不成熟,而是因為該模式可能在某些情況下丟失資料。)
預設 bcache 的 cache_mode 是 writeround,改成 writeback,提高寫入效能
echo writeback > /sys/block/bcache0/bcache/cache_mode
-效能差,或者到SSD的流量未達預期
預設情況下,bcache不會快取所有內容.它嘗試跳過順序IO,因為你真正想要快取的是隨機IO
如果你複製一個10GB的檔案,你可能也不希望將 cache 中10GB 的隨機訪問資料從快取中重新整理走(cache 可用空間不夠時,根據lru演算法將冷資料回寫到backing device)。 
但是假如你要對讀快取進行基準測試,使用 fio寫一個8 GB的測試檔案,你需要禁用它(允許順序IO):
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
調整 backing 裝置的順序IO 閾值,表示 bcache0 裝置的順序IO大於4MB 時,大於 4MB 的部分不會走 SSD 裝置,也不會快取到 ssd,而是直接讀寫 backing 裝置。(default:4M)
echo 4M > /sys/block/bcache0/bcache/sequential_cutoff
-流量仍然進入後端裝置(spindle)/仍舊得到cache miss
現實中SSD並不總是能跟上硬碟的速度,特別是那些慢速的SSD,在一塊SSD為很多HDD做快取裝置,或者出現大比例的序列化IO的情況下。假如你想避免SSD成為瓶頸,就讓每件事慢下來
bcache會跟蹤每個IO,如果IO的時間超過閾值則旁路cache裝置,直接讀寫backing裝置
為避免bcache追蹤快取裝置的延遲,假如延遲超過閾值時,逐步阻塞流量(通過降低順序旁路來實現)
如果你的SSD足夠強大,可以不跟蹤,減少跟蹤的開銷
 如果你需要的話,可以設定閾值為0來禁用它
   # echo 0 > /sys/fs/bcache/<cache set uuid>/congested_read_threshold_us
   # echo 0 > /sys/fs/bcache/<cache set uuid>/congested_write_threshold_us
關閉旁路的另一個好處是,所有的離散讀寫都會經過cache裝置,從而不會導致cache missing。
預設情況下當讀請求超過2ms,寫請求超過20ms時,旁路cache裝置。
   The default is 2000 us (2 milliseconds) for reads, and 20000 for writes. 
-某些資料仍然cache miss
最後一個困擾人們的問題事實上是個老bug,由於快取連貫性(cache coherency)對cache miss的處理方式。
當btree node慢了之後,cache miss時並不能對新資料插入key,對應資料也不能寫到cache中。
事實上這並不是問題,因為只要cache寫到來,將會導致btree node分裂(split),根本無需可觀的
寫流量,這很難觀察到(特別當bcache的btree nodes很多,要索引裝置上大部分割槽域的時候)
但當benchmark的時候,假如你想通過大量資料,讓它成為快取中的熱點時,不需要其它流量,這可能是個問題。
解決方法:
通過寫操作來讓cache形成熱點,或使用測試分支的程式碼(那裡對該問題做了修復)
Sysfs-BACKING DEVICE
實際裝置目錄: /sys/block/<bdev>/bcache
以下目錄軟連結到實際裝置目錄:
/sys/block/bcache*/bcache
/sys/fs/bcache/<cset-uuid>/bdev*
----------------------------------
比如:/sys/block/bcache0/bcache/
/sys/block/<bdev>/bcache/sys/block/bcache*/bcache/sys/fs/bcache/<cset-uuid>/bdev*(假如綁定了)中可以獲得。 
attach
echo cache set中的UUID(<cset-uuid>)到此檔案,來將快取裝置連線到後端裝置
cache_mode
可以是writethrough,writeback,writearound或none之一
參見bcache/super.c中的bch_cache_modes[], writearound可能和passthrough相同
clear_stats
寫入此檔案將重置正在執行的總(total)統計資訊(不是 day/hour/5minute的重新整理版本)
detach
寫入此檔案將從快取集(cache set)中分離.如果快取中有髒資料,則會先重新整理
dirty_data
快取中對應此backing device的髒資料量, cache 設定的版本不斷更新,但可能會稍微偏離
label
所在底層裝置名稱(Name of underlying device)
readahead
應該執行的readahead預讀資料的大小,預設為0.如果設定為,比如1M,它會將cache未命中的資料讀取到約1M,但是不會重疊現有的快取條目
running
echo 1 可強制 bcache 在無 cache 的情況下執行
假如bcache在執行時,它的值為1,也就是說,不管/dev/bcache裝置是否存在,是否它處於passthrough還是caching模式
sequential_cutoff
一旦連續的 IO 大小越過此閾值,它將繞過快取(也就是,跳過不處理連續IO);最近的128個IO將被跟蹤,因此即使沒有一次完成,也可以檢測到連續的IO (default:4M)
sequential_merge順序合併
如果非零,bcache將提交的最後128個請求的列表與所有新請求進行比較,以確定哪些新請求是先前請求的順序後繼(sequential continuations),為了確定sequential cutoff的目的.如果順序截止值大於任何單個請求的最大可接受順序大小,則這很有必要。
state
backing device 可以處於四種不同狀態之一:
  • no cache:還未附加到快取集(cache set)。
  • clean:快取集的一部分,且 cache 沒有髒資料。
  • dirty:快取集的一部分,且 cache 有髒資料。
  • inconsistent:不一致,當 cache 中存在髒資料但快取集不可用時,backing device 被使用者強制執行;backing device 上的任何資料可能已損壞了
stop
寫入此檔案以關閉 bcache 裝置並關閉 backing device
writeback_delay
當髒資料被寫入 cache 並且之前沒有包含任何資料時,在啟動(回寫磁碟)之前等待的秒數。預設為30。
writeback_percent
假如非零,bcache會試圖保持這個百分比的 cache 髒資料,並通過阻塞後臺回寫(background writeback)及使用 PD 控制器來平滑調整回寫速率 (default:10)
writeback_rate
每秒扇區回寫的速度 - 如果writeback_percent 不為0,則後臺回寫(background writeback)被限制到該指定速度。
該項由bcache連續調整,但也可由使用者設定
writeback_running
如果關閉,則根本不會發生髒資料的回寫,髒資料仍將被新增到快取中,直到快取將要滿時,僅用於基準測試。預設開啟 (default: on [on:1,off:0])
Sysfs-BACKING DEVICE 後端裝置狀態統計:
實際裝置目錄: /sys/block/<bdev>/bcache
比如 /sys/block/bcache0/bcache/stats_total主要都是IO的統計資訊
後端裝置目錄下有,狀態總計目錄(stats_total),以及一天(stats_day),1小時(stats_hour)和5分鐘(stats_five_minute)共四個目錄,它們也會聚合到cache set目錄中,其中目錄中的檔案含義分別如下:
bypassed
繞過快取的 IO (讀取和寫入)計數
cache_hits
cache_misses
cache_hit_ratio
對bcache看到的每個 IO,計數hit 和 miss以及命中率,資料部分命中(partial hit)會被計為 miss
我的理解是,SSD的命中或不命中 
cache_bypass_hits
cache_bypass_misses
繞過快取的 IO 的 hit 和 miss 的計數也會計算,但是bcache看不到
我的理解就是磁碟命中或不命中
cache_miss_collisions
cache miss的衝突數,在cache miss時寫入資料與那個寫資料成功的寫操作的條件競爭
(通常該值為0,因為cache miss的同步會被重寫)
cache_readaheads
預讀發生次數的計數
Sysfs-CACHE SET:
可在目錄/sys/fs/bcache/<cset-uuid>獲取
/sys/fs/bcache/9435d2f9-678c-403e-9472-9ca5115695c1
average_key_size 
btree中每個鍵的平均資料大小
bdev<0..n>
每個附加的後端裝置 backing device的符號連結
ls -lrth 的結果
bdev0 -> ../../../devices/pci0000:00/0000:00:02.2/0000:04:00.0/host0/port-0:0/expander-0:0/port-0:0:6/end_device-0:0:6/target0:0:6/0:0:6:0/block/sdg/bcache
block_size 
快取裝置的塊大小,塊block是最小粒度的寫單位,應該匹配硬體扇區大小
btree_cache_size
btree 快取當前使用的記憶體量(Amount of memory currently used by the btree cache)
bucket_size
buckets 大小,bucket是bcache的基本儲存單位,每個bucket再細分為多個block
cache<0..n>
組成cache set的每個cache裝置(cache devices)的符號連結
cache0 -> ../../../devices/pci0000:00/0000:00:02.2/0000:04:00.0/host0/port-0:0/expander-0:0/port-0:0:5/end_device-0:0:5/target0:0:5/0:0:5:0/block/sdf/bcache
cache_available_percent
不包含髒資料的快取裝置(空間)的百分比,並且可能被潛在用於回寫。這並不意味著這個空間不用於乾淨的快取資料;未使用的統計資訊(在priority_stats中)通常要低得多。
clear_stats
清除與此快取記憶體關聯的統計資訊, 該項只有寫許可權,不能讀
congested
congested_read_threshold_us
congested_write_threshold_us
errors
dirty_data 沒有這一項
在快取中髒資料的量(在垃圾回收(gc)執行時將更新)
flash_vol_create
echo一個size大小到這個檔案,(以人類可讀的單位,k/M/G)去建立一個由快取集(cache set)支援的精簡卷
io_error_halflife
io_error_limit
這些決定了在禁用快取之前接受的錯誤數量,每個錯誤都會在半衰期之後衰減(在#ios中),如果衰減計數達到 io_error_limit,則會寫出髒資料(到後端裝置?),並禁用快取
journal_delay_ms
日誌寫入延遲毫秒數,除非快取刷新發生得更早。預設值為100
root_usage_percent
正在使用的root btree節點的百分比,如果這值太高,節點會分裂,增加樹的深度。(default:2)
stop
寫入此檔案以關閉快取集,等待直到所有連線的後備裝置都已關閉
synchronous
tree_depth
btree的深度(單節點btree的深度為0)(default:1)
unregister