bcache 狀態/配置 文件詳細介紹(翻譯自官網)


聲明:

什么是bcache

  bcache是linux內核塊層cache.它使用類似SSD來作為HDD硬盤的cache,從而起到加速作用。 HDD硬盤便宜並且空間更大,SSD速度快但更貴。如果能兩者兼得,豈不快哉?bcache能做到。

  bcache使用SSD作為其他塊設備cache.類似ZFS的L2Arc,但bcache還增加了寫回策略,並且是與文件系統無關的。bcache被設計成只需要最小的代價,無需配置就能在所有環境中工作。默認狀態下bcache不緩存順序IO,只緩存隨機讀寫。

  bcache適用於桌面、服務器,高級存儲陣列,甚至是嵌入式環境。設計bcache目標是讓被緩存設備與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、穩定

安裝

參考文檔

調優

1.Bcache 有一堆配置選項和可調參數,默認參數對於典型的桌面和服務器工作負載是合理的,但是,當您在基准測試時,它們不是你想要獲得最佳參數
 
- Backing device 對齊
 
bcache中的默認(metadata)元數據大小為8k.如果你的 Backing device 是基於 RAID 的,那么請務必使用`make-bcache --data-offset`將其與你的 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 ...
 
- 寫入性能差
 
默認 bcache 的 cache_mode 是 writeround,改成 writeback,提高寫入性能
 
echo writeback > /sys/block/bcache0/bcache/cache_mode
 
2.默認情況下,bcache不會緩存所有內容.它嘗試跳過順序的IO,因為你確實想要緩存隨機的IO。
 
如果你復制一個10 GB的文件,你可能也不希望將 cache 中 10 GB 的隨機訪問數據從緩存中刷新走(cache 可用空間不夠時,根據 lru 算法將冷數據回寫到 backing device)。 
 
例如:如果要對緩存進行基准讀取測試,使用 fio 設置一個8 GB的測試文件,你需要禁用它:
 
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
 
 
3. 如何防止 cache 設備成為瓶頸
 
bcache會跟蹤每個IO,如果IO的時間超過閾值,則旁路cache設備,直接讀寫backing設備。
 
如果你的SSD足夠強大,可以不跟蹤,減少跟蹤的開銷。
 
   # 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. 
 

錯誤處理

Bcache嘗試透明地處理來自緩存設備的 IO 錯誤,而不會影響正常操作;如果它看到太多錯誤(閾值可配置,並且默認為0),它將關閉緩存設備並將所有  backing device 切換到 writethrough 模式。
  • 對於從緩存讀取,如果它們出現錯誤,將從 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 模式運行)。但是,如果它無法讀取臟數據,它將不會做任何操作。

BACKING DEVICE

實際設備目錄: /sys/block/<bdev>/bcache
以下目錄軟鏈接到實際設備目錄:
/sys/block/bcache*/bcache
/sys/fs/bcache/<cset-uuid>/bdev*
 
attach
echo <cset-uuid> 到此文件將緩存設備連接到后端設備
 
cache_mode
可以是writethrough,writeback,writearound或none之一
 
clear_stats
寫入此文件將重置正在運行的總(total)統計信息(不是 day/hour/5minute)
 
detach
寫入此文件將從緩存集中分離.如果緩存中有臟數據,則會先刷新
 
dirty_data
緩存中此 backing device 的臟數據量, cache 設置的版本不斷更新,但可能會稍微偏離
 
label
底層設備名稱
 
readahead
應該執行的readahead的大小,默認為0.如果設置為1M,它會將cache未命中的數據讀取到 1M,但是沒有重疊現有的緩存條目
 
running
echo 1 可強制 bcache 在無 cache 的情況下運行
 
sequential_cutoff
一旦連續的 IO 大小越過此閾值,它將繞過緩存;最近的128個IO被跟蹤,因此即使沒有一次完成,也可以檢測到連續的IO (default:4M)
 
sequential_merge
如果非零,bcache將提交的最后128個請求的列表與所有新請求進行比較,以確定哪些新請求是先前請求的順序連續,以確定順序截止.如果順序截止值大於任何單個請求的最大可接受順序大小,則這是必需的
 
state
backing device 可以處於四種不同狀態之一:
 
  • no cache:從未附加到緩存集。
  • clean:部分緩存集,且 cache 沒有臟數據。
  • dirty:部分緩存集,且 cache 有臟數據。
  • inconsistent:backing device 被用戶強制運行后 cache 中存在臟數據但緩存集不可用時;backing device 上的任何數據可能已損壞
stop
寫入此文件以關閉 bcache 設備並關閉 backing device
 
writeback_delay
當臟數據被寫入 cache 並且之前沒有包含任何數據時,在啟動回寫之前等待幾秒鍾。默認為30。
 
writeback_percent
bcache 試圖保持這個百分比的 cache 臟數據,並通過調節 writeback 及使用 PD 控制器來平滑調整速率 (default:10)
 
writeback_rate
每秒多少扇區的速度 - 如果 writeback_percent 不為0,則回寫被限制到指定速度。
由 bcache 連續調整,但也可由用戶設置
 
writeback_running
如果關閉,則不會發生臟數據的回寫,臟數據仍將被添加到緩存中,直到其將要滿時.僅用於基准測試。默認開啟 (default: on [on:1,off:0])
 

BACKING DEVICE 狀態統計:

實際設備目錄下有狀態總計目錄(stats_total),以及一天(stats_day),1小時(stats_hour)和5分鍾(stats_five_minute)共四個目錄,其中目錄中的文件含義分別如下:
 
bypassed
繞過緩存的 IO (讀取和寫入)量
 
cache_hits
cache_misses
cache_hit_ratio
在 bcache 來看,hit 和 miss 根據每個 IO 來計數,部分 hit 會被計為 miss
 
cache_bypass_hits
cache_bypass_misses
繞過緩存的 IO 的 hit 和 miss 的計數
 
cache_miss_collisions
cache miss 插入 cache 的實例計數,但是隨着寫入和數據已經存在(通常為0,因為 cache miss 的同步被重寫)
原文:
Counts instances where data was going to be inserted into the cache from a cache miss, but raced with a write and data was already present (usually 0 since the synchronization for cache misses was rewritten)
 
cache_readaheads
預讀次數的計數
CACHE SET:
所在目錄:/sys/fs/bcache/<cset-uuid>
 
average_key_size        # todo
btree中每個鍵的平均大小
 
bdev<0..n>
link 到每個附加的 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 
緩存設備的塊大小
 
btree_cache_size
btree 緩存當前使用的內存量
 
bucket_size
buckets 大小
 
cache<0..n>
link 到 cache device 的真實設備
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
清除與此高速緩存關聯的統計信息
 
dirty_data
在緩存中臟數據的量(在垃圾回收(gc)運行時將更新)
 
flash_vol_create
echo 一個大小到這個文件,(以人類可讀的單位,k/M/G)創建一個由緩存集支持的精簡卷
 
io_error_halflife
io_error_limit
這些決定了在禁用緩存之前接受的錯誤數量,每個錯誤都會在半衰期之后衰減(在#ios中),如果衰減計數達到 io_error_limit,則會寫出臟數據,並禁用緩存
 
journal_delay_ms
日志寫入延遲幾毫秒,除非緩存刷新發生得更早。默認值為100
 
root_usage_percent
正在使用的 root btree節點的百分比,如果這太高,節點會分裂,增加樹的深度。(default:2)
 
stop
寫入此文件以關閉緩存集,等待直到所有連接的后備設備都已關閉
 
tree_depth
btree的深度(單節點btree的深度為0)(default:1)
 
unregister
分離所有 backing device 並關閉緩存設備,如果存在臟數據,它將禁用回寫式緩存並等待它被刷新
 

CACHE SET INTERNAL

所在目錄:/sys/fs/bcache/<cset-uuid>/internal/
 
此目錄也暴露出大量的內部操作的計時,具有平均持續時間,平均頻率,最后一個匹配項和最大持續時間:垃圾收集,btree讀取,btree節點排序和btree分割
原文:
This directory also exposes timings for a number of internal operations, with separate files for average duration, average frequency, last occurrence and max duration: garbage collection, btree read, btree node sorts and btree splits.
 
active_journal_entries
比索引新的日志條目的數目
 
btree_nodes
btree中的總節點
 
btree_used_percent
btree在使用中的平均值
 
bset_tree_stats
關於輔助搜索樹的統計
 
btree_cache_max_chain
btree節點緩存的哈希表中最長的鏈
 
cache_read_races
計數在從緩存讀取數據的情況下,桶被重用和無效 - 即在讀取完成后指針過期。發生這種情況時,數據將從后備設備重新讀取
 
trigger_gc
寫入此文件將強制運行垃圾回收
CACHE DEVICE:
<cdev>=cache設備的真實設備名
所在目錄: /sys/block/<cdev>/bcache
 
block_size
寫入的最小粒度應符合硬件扇區大小
 
btree_written
所有btree寫入的總和,(千/兆/千兆)字節
 
bucket_size
bucket 大小
 
cache_replacement_policy
cache 刷新策略,lru,fifo或random
 
discard
存儲SSD TRIM 開關的開啟與關閉狀態
 
freelist_percent        # 人為減小可以緩存的數據量
空閑cache的大小占總數的百分比。可以寫入來增加freelist上保存的 bucket 數,這樣可以在運行時人為地減小緩存的大小。主要用於測試目的(即測試不同大小的緩存如何影響您的命中率),但是由於在移動到freelist之后丟棄了 bucket,因此也可以通過有效地給予更多的保留空間來使SSD的垃圾回收更容易。
 
io_errors
發生的錯誤數量,由 io_error_halflife 衰減
 
metadata_written
所有非數據寫入(btree寫入和所有其他元數據)的總和
 
nbuckets
此緩存中的總桶數
 
priority_stats

關於緩存中最近的數據被訪問的統計信息。這可以顯示您的工作集大小。

  • Unused:是不包含任何數據的緩存的百分比
  • Metadata:是bcache的元數據占的百分比
  • Average:是 cache buckets 的平均優先級。
  • Quantiles:是每個具有優先級閾值的分位數的列表
  • 原文:
  • a list of quantiles with the priority threshold of each
 
written
已寫入高速緩存的所有數據的總和;與btree_written的比較獲得 bcache 實際的寫入增量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM