Bcache

bcache是按照SSD特性来设计的,只按擦除桶大小进行分配,使用btree和日志混合方法来跟踪缓存数据,缓存数据可以是桶上的任意一个扇区。bcache最大程度上减少了随机写的代价,它按顺序填充一个桶,重新使用时只需将桶设置为无效。
bcache支持写直达和回写策略。回写默认情况下是关闭的,可以在运行时改变。bcache还在最大程度上保护你的数据,在系统异常关机时数据仍然是可靠的。因为它被设计为只有在数据完全写回存储设备才确认写成功。
回写策略能够缓存绝大多数的写请求,然后再按照索引将脏数据按次序写回到后端存储设备。
SSD的特点就是随机IO速度很快,而对于大块顺序IO的提升却并不大。bcache会检测顺序IO并忽略;还会对每一个任务记录动态的平均IO大小,当平均IO大小超过截止值时该任务后面的IO将会被忽略,这样就可以透传备份或者大文件拷贝。
在flash上发现数据IO错误时,首先会尝试读以恢复数据或者将该缓存项置为无效。对于不可恢复的错误,例如元数据或脏数据,bcache将会自动关闭缓存。如果有脏数据在缓存中,这时会首先关闭回写策略然后再等待脏数据刷回。
linux内核需3.10以上,首先需要安装bcache-tools,它提供了make-bcache工具。下载地址:
git clone http://evilpiepirate.org/git/bcache-tools.git
git clone https://github.com/g2p/bcache-tools.git

ubuntu可以用apt-get安装:
sudo add-apt-repository ppa:g2p/storage
sudo apt-get update
sudo apt-get install bcache-tools
缓存设备和后端磁盘在使用前都需要先初始化:

    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规则文件,bcache设备可以立即被内核感知。如果没有udev规则,需要手动注册设备:

    echo /dev/sdc > /sys/fs/bcache/register

注册了后端磁盘后,bcache设备会出现在/dev/目录下,现在就可以格式化然后使用了。bcache设备默认是透传模式,因此需要绑定缓存。
bcache显示如下:

    /dev/bcache<N>

还有(有udev规则文件时):

    /dev/bcache/by-uuid/<uuid>  
    /dev/bcache/by-label/<label>

如果要开始使用:

    mkfs.ext4 /dev/bcache0  
    mount /dev/bcache0 /mnt

bcache的sysfs控制项在/sys/block/bcache<N>/bcache。
bcache设备是按集合来管理的,但目前一个集合只支持一个bcache设备,将来会支持多个设备、元数据和脏数据镜像。新cache设备显示为/sys/fs/bcache/<UUID>
cache绑定:
在缓存设备和后端设备都注册之后,还要将缓存设备绑定到后端设备从而使用缓存。绑定操作如下:

    echo <CSET-UUID>  > /sys/block/bcache0/bcache/attach

这个操作只需要做一次就可以了。下一次系统重启时,只需要重新注册所有bcache设备。如果后端设备还有未定回的缓存数据,那么就不会创建/dev/bcache<N>,直到缓存设备回来,尤其在写回策略时特别重要。
如果需要在没有缓存设备的时候强制使用设备:

    echo 1 > /sys/block/sdb/bcache/running

注意这里参数是后端设备,而不是bcache设备,何况此时bcache设备还没有创建。如果是使用分区创建的bcache设备,例如sdb2对应的目录是/sys/block/sdb/sdb2/bcache。
在强制使用bcache设备后,缓存设备添加到系统,这个缓存设备的所有缓存数据将会设置为无效。缓存设备的脏数据是不会继续,因为这些脏数据将有可能使现在文件系统崩溃。

错误处理
bcache尝试处理IO错误而不影响正常操作,但如果错误数超过阀值(默认是0,可配置)会关闭缓存并切换到透传模式。
-如果是读错误则尝试直接从后端设备读
-如果是写直达写错误,将缓存对应数据块设置为无效
-去绑定时,刷回脏数据。脏数据写回失败目前是没有处理的。

性能相关问题
bcache有很多配置选项和可调参数。默认值适合于典型配置,如果想要更好性能则需要调整相关参数。
-写性能差
如果写性能不理想,那么建议调到写回策略

    #echo writeback > /sys/block/bcache0/cache_mode

-性能差,或者流量并没有缓存到SSD
默认情况下,bcache不会缓存顺序IO和大文件。
打开顺序IO缓存:

    #echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

设置回默认值:

    #echo 4M > /sys/block/bcache0/bcache/sequential_cutoff

-流量小,缓存不命中
现实生活中,并不是所有SSD都能提供足够快的速度作为磁盘的缓存,特别一个SSD作为多块磁盘的缓存,或者顺序IO时。所以需要避免SSD成为系统瓶颈。
为了避免bcache设备因为SSD变慢,当延迟超过阀值时逐渐减少流量。需要关闭拥塞控制项:

    #echo 0 > /sys/fs/bcache/<cache set>/congested_read_threshold_us  
    #echo 0 > /sys/fs/bcache/<cache set>/congested_write_threshold_us

对于读,默认值是2000us(2ms),对于写是20000.

SYSFS - 后端设备
/sys/block/<bdev>/bcache, /sys/block/bcache*/bcache, /sys/fs/bcache/<cset-uuid>/bdev*

SYSFS - 缓存集合
/sys/fs/bcache/<cset-uuid>

SYSFS - 缓存设备
/sys/block/<cdev>/bcache

删除cache设备

    #echo 1 > /sys/fs/bcache/<uuid>/unregister

删除backing设备

    #echo 1 > /sys/block/bcache<N>/bcache/stop

新建文件

时间: 2024-07-30 10:15:29

Bcache的相关文章

[troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层架构,不!重!装!)

目标: 我要做的事情是:修改文件系统,硬盘分区方案,但是不重装系统,整个操作不被应用层感知. 背景: 我的笔记本 ThinkPad T450.8G内存 + 16GB SSD + 1TB HDD.预装windows7. 在预装系统里16GB的SSD好像是被win7用作睡眠之类的功能.电脑拿到手之后的第一件事我就是想办法把linux装进去.我当初的方案是: 1. 备份win7.比较是预装的,也算是正版.我把1TB硬盘C盘中的文件压缩拷贝出来了.然后又把硬盘开始1GB dd了出来.这样有一点可以装回去

linux bcache

Bcache是Linux平台上具备缓存加速的技术框架,是一种针对慢速设备的性能提升策略. 1.需要安装bcache-tools 具体可以参照https://bcache.evilpiepirate.org/ 2.bcache包含cache device 和 blacking device:blacking device一般是大容量的机械硬盘,统属block device make-bcache -B /dev/sdx   将生成/dev/bcache0 3.cache device 一般由ssd

[archlinux][hardware] ThankPad T450自带SSD做bcache之后的使用寿命分析

这个分析的起因,是由于我之前干了这两个事: [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层架构,不!重!装!) [archlinux][hardware] 查看SSD的使用寿命 在12月06日完成了底层硬盘的调整之后,做了如下的硬盘指标统计: /home/tong/Workspace/system/bcache [[email protected]] [17:18] > cat 2016

关于bcache的一些事情

最近因为工作的原因接触到bcache缓存技术的一些皮毛,做个笔记备忘. bcache是自3.10开始集成到Linux Kernel中去,后面更新了几个版本增加了一些功能. 另一个备用技术选项为facebook开创的flashcache.但是作者在github表示,基本不敢用. This project is not actively maintained. Proceed at your own risk! 除了在Linux 3.10内核中提供支持以外,还有一个bcache-tools工具,用户

【linux】free命令中cached和buffers的区别

一.命令 [[email protected] ~]# free -m total used free shared buffers cached Mem: 7869 7651 218 1 191 5081 -/+ buffers/cache: 2378 5490 Swap: 478 139 339 二.计算 这里使用1.2 分别代表第一行和第二行的数据 total1:表示物理 内存总量 used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使

PHPActivity.java

package www.wulian1.com.webview; import android.content.SharedPreferences;import android.icu.text.IDNA;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Lo

对WebView接口的实现

MainActivity package www.wulian1.com.webview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; public class MainActivity extends AppCompatActivity { @Override     protected void onCreate(Bundle

哈希表入门讲解

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列函数,存放记录的数组称做散列表. 一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名{\displaystyle x}到首字母{\displaystyle F(x)}的一个函数关系),在首字母为W的表中查找"王"姓的电话号

jdbc 读取oracle long raw 字段,里面存的是文本

参考: http://singlewolf.iteye.com/blog/278769 http://blog.csdn.net/restraint/article/details/7190265 http://blog.csdn.net/bq1073100909/article/details/49335491 String sql = "select condition from tbl t where t.a = ? and t.b = ?"; PreparedStatement