什么是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、稳定
安装
https://yq.aliyun.com/articles/60734
=====================================
声明:
bcache 中脏数据的定义:
- 在 writeback 模式下,Cache 中的数据还未回写到 Backing device 时,即认为它是脏数据(在 bcache 中的脏数据与内存的脏数据性质不同,内存的脏数据由于内存本身的特性,掉电等意外发生时数据会丢失,而在 bcache 中由于数据是存放在磁盘上的,所以掉电等意外并不会导致数据丢失)
调优
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 # TODO
一旦连续的 IO 大小越过此阈值,它将绕过缓存;最近的128个IO被跟踪,因此即使没有一次完成,也可以检测到连续的IO (default:4M)
sequential_merge
如果非零,bcache将提交的最后128个请求的列表与所有新请求进行比较,以确定哪些新请求是先前请求的顺序连续,以确定顺序截止.如果顺序截止值大于任何单个请求的最大可接受顺序大小,则这是必需的
state
backing device 可以处于四种不同状态之一:
- 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
- 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 # todo
缓存设备的块大小
btree_cache_size
btree 缓存当前使用的内存量
bucket_size # TODO
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 # TODO
这些决定了在禁用缓存之前接受的错误数量,每个错误都会在半衰期之后衰减(在#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 # TODO
存储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 实际的写入增量
- bcache 状态/配置 文件详细介绍(翻译自官网)
声明: 文中 斜体带下划线 的段落为翻译不够准确的段落 原文:https://www.kernel.org/doc/Documentation/bcache.txt 官网:https://bcach ...
- kubernetes实战篇之helm示例yaml文件文件详细介绍
系列目录 前面完整示例里,我们主要讲解helm打包,部署,升级,回退等功能,关于这里面的文件只是简单介绍,这一节我们详细介绍一下这里面的文件,以方便我们参照创建自己的helm chart. Helm ...
- log4j的log4j.properties文件配置的详细介绍
参考(common): http://blog.csdn.net/qq_30175203/article/details/52084127 参考2(log4j.additivity): http:// ...
- CCNA网络工程师学习进程(4)网络设备的基本配置和详细介绍
网络设备(路由器.交换机和防火墙等)与计算机一样需要操作系统.网络设备采用专用的操作系统,统称为IOS(Internetwork Operating System,网络操作系统). ( ...
- vue中eslintrc.js配置最详细介绍
本文是对vue项目中自带文件eslintrc.js的内容解析, 介绍了各个eslint配置项的作用,以及为什么这样设置. 比较详细,看完能对eslint有较为全面的了解,基本解除对该文件的疑惑. /* ...
- Ceph14.2.5 RBD块存储的实战配置和详细介绍,不看后悔! -- <3>
Ceph RBD介绍与使用 RBD介绍 RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型.RBD块设备类似磁盘可以被挂载. RBD块设备具有快照.多副本.克隆 ...
- mac os apache 配置方法详细介绍
我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...
- haproxy笔记之三:配置HAProxy详细介绍
2.1 配置文件格式 HAProxy的配置处理3类来主要参数来源:——最优先处理的命令行参数,——“global”配置段,用于设定全局配置参数:——proxy相关配置段,如“defaults”.“li ...
- C#中XmlTextWriter读写xml文件详细介绍(转)
转自http://www.jb51.net/article/35230.htm .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单.在这篇文章中,我将给 ...
随机推荐
- windows下搭建Nexus3私服和基于IDEA15的Maven学习笔记
搭建Nexus私服. 首先去官网下载window下用的zip文件.https://www.sonatype.com/download-oss-sonatype. 解压之后包含下面两个文件 进入nexu ...
- Java静态代理和动态代理总结
静态代理 第一种实现(基于接口): 1>接口 public interface Hello { void say(String msg);} 2>目标类,至少实现一个接口 public c ...
- JavaScript 毒瘤和糟粕(需要注意的地方)
简介 我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容.你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要. 毒瘤 全局变量 全局变量的存在的确是带来了方便,但是我觉 ...
- libviso中的姿态解算【转载】
这篇关于libviso的文章,本人已投稿在泡泡机器人微信公众号中,放到这里,作学习笔记用. libviso一直以来被称为在视觉里程计(VO)中的老牌开源算法.它通过corner,chessboard两 ...
- 【PHP系列】PHP组件详解
缘起 枫爷之前做过几年的PHP的研发,大部分都是在开源框架的引导下,编写代码.现在依然,本能的会去让我使用某个PHP框架开发PHP应用,也是因为懒吧,没有好好的去研究研究除了框架之外的一些东西. 今天 ...
- caoz大神力作、互联网从业者必读之书——《你凭什么做好互联网》深入总结
作者简介:曹政--俞军的关门弟子,CNZZ统计工具的缔造者,前百度商业产品部boss,4399CTO,微信公众号"caoz的梦呓"(yi),文后附上二维码,经常发布各种互联网干货, ...
- PCB行业ERP解决方案
普实PCB管理系统包括PCB企业从接到订单开始,编排生产计划.制作工程指示.生产工具.准备物料.品质保障.工序生产.设备维护等一系列与企业运作密切相关的环节,使得企业的各个部门能够紧密联系.相互协调, ...
- 用JavaScript实现图片剪切效果
学会如何获取鼠标的坐标位置以及监听鼠标的按下.拖动.松开等动作事件,从而实现拖动鼠标来改变图片大小. 还可以学习css中的clip属性. 一.CSS实现图片不透明及裁剪效果. 图片剪切三层结构 1.第 ...
- Vue学习之路---No.1(分享心得,欢迎批评指正)
首先为了打消大家对Vue.js存在的顾虑,先通过大家所熟知的JQ作为对比. 都知道JQ的语法相对简单.清楚.使用方便.功能齐全: 那么Vue.js呢,同样的,Vue.js与JQ在很多地方都是相同之处, ...
- 版本管理工具 —— SVN
想想我们在开发过程中是不是会遇到这样的情况: 今天写了很长的一段代码,觉得不合理,然后删了,第二天突然发现昨天的那段代码才是正确的,那怎么办,也无法撤销删除的代码? 还有团队中多人共同开发一个项目,如 ...