linux cache控制 内核,linux内核之bcache简介 [转]

bcache是按照SSD特性来设计的,只按擦除桶大小进行分配,使用btree和日志混合方法来跟踪缓存数据,缓存数据可以是桶上的任意一个扇区。bcache最大程度上减少了随机写的代价,它按顺序填充一个桶,重新使用时只需将桶设置为无效。

bcache支持写直达和回写策略。回写默认情况下是关闭的,可以在运行时改变。bcache还在最大程度上保护你的数据,在系统异常关机时数据仍然是可靠的。因为它被设计为只有在数据完全写回存储设备才确认写成功。

回写策略能够缓存绝大多数的写请求,然后再按照索引将脏数据按次序写回到后端存储设备。

SSD的特点就是随机IO速度很快,而对于大块顺序IO的提升却并不大。bcache会检测顺序IO并忽略;还会对每一个任务记录动态的平均IO大小,当平均IO大小超过截止值时该任务后面的IO将会被忽略,这样就可以透传备份或者大文件拷贝。

在flash上发现数据IO错误时,首先会尝试读以恢复数据或者将该缓存项置为无效。对于不可恢复的错误,例如元数据或脏数据,bcache将会自动关闭缓存。如果有脏数据在缓存中,这时会首先关闭回写策略然后再等待脏数据刷回。

从这里开始

首先需要安装bcache-tools,它提供了make-bcache工具。缓存设备和后端磁盘在使用前都需要先初始化:

make-bcache -B /dev/sdb

make-bcache -C /dev/sdc

make-bcache -B /dev/sdb

make-bcache -C /dev/sdc

make-bcache提供了同时初始化多个设备的功能,并自动绑定缓存设备和后端磁盘:

make-bcache -B /dev/sda /dev/sdb -C /dev/sdc

make-bcache -B /dev/sda /dev/sdb -C /dev/sdc

bcache-tools现在已经包含了udev规则文件,bcache设备可以立即被内核感知。如果没有udev规则,需要手动注册设备:

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

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

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

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

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

bcache显示如下:

/dev/bcache<N>

/dev/bcache

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

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

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

/dev/bcache/by-uuid/

/dev/bcache/by-label/

如果要开始使用:

mkfs.ext4 /dev/bcache0

mount /dev/bcache0 /mnt

mkfs.ext4 /dev/bcache0

mount /dev/bcache0 /mnt

bcache的sysfs控制项在/sys/block/bcache/bcache。

bcache设备是按集合来管理的,但目前一个集合只支持一个bcache设备,将来会支持多个设备、元数据和脏数据镜像。新cache设备显示为/sys/fs/bcache/

cache绑定:

在缓存设备和后端设备都注册之后,还要将缓存设备绑定到后端设备从而使用缓存。绑定操作如下:

echo

> /sys/block/bcache0/bcache/attach

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

如果需要在没有缓存设备的时候强制使用设备:

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

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

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

-性能差,或者流量并没有缓存到SSD

默认情况下,bcache不会缓存顺序IO和大文件。

打开顺序IO缓存:

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

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

设置回默认值:

#echo 4M>/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/<cacheset>/congested_read_threshold_us

#echo 0>/sys/fs/bcache/<cacheset>/congested_write_threshold_us

#echo 0 > /sys/fs/bcache//congested_read_threshold_us

#echo 0 > /sys/fs/bcache//congested_write_threshold_us

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

SYSFS

- 后端设备

/sys/block//bcache, /sys/block/bcache*/bcache,

/sys/fs/bcache//bdev*

SYSFS

- 缓存集合

/sys/fs/bcache/

SYSFS

- 缓存设备

/sys/block//bcache

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中,Page Cache和Buffer Cache都是用于缓存文件系统数据的机制,但它们的缓存对象和缓存方式不同。 Page Cache是用于缓存文件系统数据块的机制,它缓存的是文件系统中的整个页(通常为4KB)。当应用程序请求访问文件时,内核会首先在Page Cache中查找对应的页,如果找到了就直接返回给应用程序,避免了访问磁盘的开销。如果Page Cache中没有找到对应的页,则内核会从磁盘中读取相应的数据块,并将其缓存到Page Cache中。Page Cache的优点是能够加速对文件的访问速度,提高系统的性能。但是,它也会占用系统的内存资源,如果文件系统中的文件过多,Page Cache可能会占用大量的内存资源。 Buffer Cache是用于缓存块设备数据块的机制,它缓存的是块设备中的数据块(通常为512字节或4KB)。当应用程序请求访问块设备时,内核会首先在Buffer Cache中查找对应的数据块,如果找到了就直接返回给应用程序,避免了访问块设备的开销。如果Buffer Cache中没有找到对应的数据块,则内核会从块设备中读取相应的数据块,并将其缓存到Buffer Cache中。Buffer Cache的优点是能够加速对块设备的访问速度,提高系统的性能。但是,它也会占用系统的内存资源,如果块设备中的数据块过多,Buffer Cache可能会占用大量的内存资源。 因此,Page Cache和Buffer Cache都是用于加速对文件系统或块设备的访问速度的机制,它们的区别在于缓存的对象和缓存的方式不同。Page Cache缓存的是文件系统的整个页,Buffer Cache缓存的是块设备的数据块。Page Cache的缓存方式是基于文件系统的,Buffer Cache的缓存方式是基于块设备的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值