您的位置:首页 > 其它

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

2017-03-29 16:40 603 查看

声明:

文中 斜体带下划线 的段落为翻译不够准确的段落

原文: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目标是让被缓存设备与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 开关的开启与关闭状态

延伸知识:在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
关于缓存中最近的数据被访问的统计信息。这可以显示您的工作集大小。

Unused:是不包含任何数据的缓存的百分比

Metadata:是bcache的元数据占的百分比

Average:是 cache buckets 的平均优先级。

Quantiles:是每个具有优先级阈值的分位数的列表

原文:

a list of quantiles with the priority threshold of each

written
已写入高速缓存的所有数据的总和;与btree_written的比较获得 bcache 实际的写入增量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: