bcache状态和配置文件详细介绍(翻译自官网)

来源:互联网 发布:淘宝看图购在哪里发布 编辑:程序博客网 时间:2024/06/03 13:02
参考文献
http://www.cnblogs.com/zimufeng/p/6640439.html 有参考价值
https://www.kernel.org/doc/Documentation/bcache.txt

声明:
  • 原文: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)
 
freelist_percent        # 人为减小可以缓存的数据量没有这个配置项
空闲cache的大小占总数的百分比。可以写入该值来增加freelist上保存的 bucket 数,这样可以在运行时人为地减小缓存的大小。主要用于测试目的(即测试不同大小的缓存如何影响您的命中率),但是由于在移动到freelist之后丢弃了 bucket,因此也可以通过有效地给予更多的保留空间来使SSD的垃圾回收更容易。
 
io_errors
已经发生的错误数量,由 io_error_halflife 衰减
 
metadata_written
所有非数据写入(btree写入和所有其他元数据)的总和
 
nbuckets
此缓存中的总桶数
 
priority_stats
关于缓存中最近的数据被访问的统计信息。这可以显示您的工作集(working set)大小。
  • Unused:是不包含任何数据的缓存的百分比
  • Metadata:是bcache的元数据占的百分比
  • Average:是 cache buckets 的平均优先级。
  • Next: 是每个具有优先级阈值的分位数的列表

written
已写入缓存的所有数据的总和
比较:btree_written是获得实际写入bcache的总量
 
原创粉丝点击