您的位置:首页 > 其它

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

2017-10-20 15:50 2331 查看
参考文献
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的总量
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: