bcache状态和配置文件详细介绍(翻译自官网)
生活随笔
收集整理的這篇文章主要介紹了
bcache状态和配置文件详细介绍(翻译自官网)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考文獻
http://www.cnblogs.com/zimufeng/p/6640439.html 有參考價值
https://www.kernel.org/doc/Documentation/bcache.txt
聲明:
什么是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?模式。
奇技淫巧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開發小組: linux-bcache@vger.kernel.org 務必提供更多的信息,包括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 可以處于四種不同狀態之一:
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 注銷,分離所有 backing device 并關閉緩存設備,如果存在臟數據,它將禁用回寫式緩存并等待它被刷新 ? Sysfs-CACHE SET INTERNAL 所在目錄:/sys/fs/bcache/<cset-uuid>/internal/ 比如/sys/fs/bcache/9435d2f9-678c-403e-9472-9ca5115695c1/internal 其中uuid是/dev/sdm這塊SSD對應的? 下面是數據項的實例測試值,僅供參考
此目錄也暴露出大量的內部操作的計時,使用不同的文件記錄,包括平均持續時間,平均頻率,最后發生時刻和最大持續時間:垃圾收集,btree讀取,btree節點排序和btree分裂 active_journal_entries 比索引新(newer than the index)的日志條目數 ? btree_nodes btree中的總節點 ? btree_used_percent btree在使用中的平均值 ? bset_tree_stats 關于輔助搜索樹(auxiliary search tree)的統計 ? btree_cache_max_chain btree節點緩存的哈希表中最長的鏈 ? cache_read_races 累計當從緩存讀取數據的情況下,桶被重用和失效的次數 - 即在讀取完成后指針過期。發生這種情況時,數據將從后備設備重新讀取 ? trigger_gc 寫入此文件將強制運行垃圾回收
Sysfs-CACHE DEVICE:
比如:/sys/fs/bcache/9435d2f9-678c-403e-9472-9ca5115695c1/cache0 其中uuid是/dev/sdm這塊SSD對應的 ?
block_size 寫入的最小粒度-應符合硬件扇區大小 這里是4.0k ? btree_written 所有btree寫入的總和,單位(千/兆/千兆)字節 這里是1.0G ? bucket_size bucket 大小 這里是1.0M ? cache_replacement_policy cache替換策略,lru,fifo或random之一 ? discard 布爾值,假如值為on,在重用之前,使用discard/TRIM去觸發每個bucket;默認值為off,因為SATA TRIM是非排隊命令(因此很慢) 存儲SSD TRIM 開關的開啟與關閉狀態
written 已寫入緩存的所有數據的總和 比較:btree_written是獲得實際寫入bcache的總量 ?
聲明:
- 原文:https://www.kernel.org/doc/Documentation/bcache.txt
- 官網:https://bcache.evilpiepirate.org/
什么是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開發小組: linux-bcache@vger.kernel.org 務必提供更多的信息,包括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 注銷,分離所有 backing device 并關閉緩存設備,如果存在臟數據,它將禁用回寫式緩存并等待它被刷新 ? Sysfs-CACHE SET INTERNAL 所在目錄:/sys/fs/bcache/<cset-uuid>/internal/ 比如/sys/fs/bcache/9435d2f9-678c-403e-9472-9ca5115695c1/internal 其中uuid是/dev/sdm這塊SSD對應的? 下面是數據項的實例測試值,僅供參考
此目錄也暴露出大量的內部操作的計時,使用不同的文件記錄,包括平均持續時間,平均頻率,最后發生時刻和最大持續時間:垃圾收集,btree讀取,btree節點排序和btree分裂 active_journal_entries 比索引新(newer than the index)的日志條目數 ? btree_nodes btree中的總節點 ? btree_used_percent btree在使用中的平均值 ? bset_tree_stats 關于輔助搜索樹(auxiliary search tree)的統計 ? btree_cache_max_chain btree節點緩存的哈希表中最長的鏈 ? cache_read_races 累計當從緩存讀取數據的情況下,桶被重用和失效的次數 - 即在讀取完成后指針過期。發生這種情況時,數據將從后備設備重新讀取 ? trigger_gc 寫入此文件將強制運行垃圾回收
Sysfs-CACHE DEVICE:
比如:/sys/fs/bcache/9435d2f9-678c-403e-9472-9ca5115695c1/cache0 其中uuid是/dev/sdm這塊SSD對應的 ?
block_size 寫入的最小粒度-應符合硬件扇區大小 這里是4.0k ? btree_written 所有btree寫入的總和,單位(千/兆/千兆)字節 這里是1.0G ? bucket_size bucket 大小 這里是1.0M ? cache_replacement_policy cache替換策略,lru,fifo或random之一 ? discard 布爾值,假如值為on,在重用之前,使用discard/TRIM去觸發每個bucket;默認值為off,因為SATA TRIM是非排隊命令(因此很慢) 存儲SSD TRIM 開關的開啟與關閉狀態
- 延伸知識:在SSD上使用TRIM,默認是不開啟的 (固態硬盤(SSD)為什么需要TRIM?,TRIM 的解釋查看參考資料?Trim)
- Unused:是不包含任何數據的緩存的百分比
- Metadata:是bcache的元數據占的百分比
- Average:是 cache buckets 的平均優先級。
- Next: 是每個具有優先級閾值的分位數的列表
written 已寫入緩存的所有數據的總和 比較:btree_written是獲得實際寫入bcache的總量 ?
總結
以上是生活随笔為你收集整理的bcache状态和配置文件详细介绍(翻译自官网)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu 16.04.1 LTS上
- 下一篇: SimpleHTTPServer中出错信