Bcache块缓存使用方式
最近淘到了一块傲腾16内存,一种使用NVMe协议的小容量高性能的SSD,因早期价格高昂而遭到唾弃,现在二手价格大约十几块左右,在windwos下有配合官方软件使用可以提升磁盘读写性能。Linux下没有相关软件支持,而且网上也没用相关的教程,今天就是要把傲腾内存折腾在服务器上,以提升机械硬盘的读写性能。
思路如下: 把傲腾内存挂载到linux,再使用Bcache把SSD划分成缓存给机械硬盘提速。
基础介绍
Bcache依赖于Linux 3.0以上的内核,大多数情况下应能满足。
本次使用到的应用是bcache,它可以用来将一些较快的存储设备(如SSD),当作另一些较慢的存储设备(如HDD)的缓存。这样可以创建出性能尚可的混合存储。
其加速原理主要是如下几点:
- 使用SSD缓存随机读。因为HDD在寻道上的时间远大于读取数据的时间,而SSD有近乎于0的寻址时间,所以在缓存命中时会有很大的提升。
- 使用SSD缓存随机写,并将随机写操作合并后改成顺序写。这里一方面有和随机读相同的优* 化原理(减少寻址时间),另一方面也避免了SSD的写放大问题。
- 顺序读写会跳过缓存,直接进入HDD,避免大量冲刷SSD中的随机读缓存。
写放大:SSD在写入之前需要擦除,但是单位擦除的体积(如256KiB)远大于单位写入的体积(如4KiB)。
开始配置
首先,需要安装bcache-tools,根据系统的类型可分别使用apt install bcache-tools 或yum install bcache-tools等。
然后需要准备两块磁盘(或分区),这里使用分别使用 /dev/sda1 做HDD,/dev/nvme0n1做SSD。
在执行bcache之前,需要对相应的存储设备初始化,会清空上面的所有数据。请先做好备份!
- 首先安装bcache-tools
apt install bcache-tools
擦除对应设备上的数据
wipefs -a /dev/sda1 # 机械盘
wipefs -a /dev/nvme0n1 # 固态盘(缓存)
格式化
make-bcache -B /dev/sda1 # 机械盘
make-bcache -C /dev/nvme0n1 # 固态盘(缓存)
此时使用lsblk命令查看,应已经能查到 /dev/sda1 下面有个bcache0设备了。
关联 Cache 设备(固态盘)和 Backing 设备(机械盘), 先查看 Cache 设备(固态盘)的 set-uid 值。
bcache-super-show /dev/nvme0n1 | grep cset.uuid
cset.uuid 9b1e7bf9-a97a-4785-bacb-0b17189adc08
复制上面的 cset.uuid 对应的值,即 9b1e7bf9-a97a-4785-bacb-0b17189adc08,换成真实机器上的值。
执行关联
echo cset.uuid > /sys/block/bcache0/bcache/attach
上面的命令中,cset.uuid 要换成具体的值,类似于 9b1e7bf9-a97a-4785-bacb-0b17189adc08这种。
这个时候再调用 lsblk 命令查看,应可以看到 /dev/sda1
和 /dev/nvme0n1
下面各有一个bcache0设备了。
调整缓存模式
默认的模式是 Write-through,如果想换成其它模式,如 Write-back,则可以使用如下的命令来实现:
echo writeback > /sys/block/bcache0/bcache/cache_mode
可选值有:writethrough writeback writearound none
缓存模式
Bcache支持三种模式:write-through
(默认)、write-back
、及write-around
。它们的主要区别在写操作的处理上。
这也是所有缓存机制都面临的模式选择,不是bcache独有的。
下面简单介绍下三种模式的区别:
- Write-through 同时写入到SSD和HDD,并在SSD和HDD都写成功后再返回成功。
- Write-back 先写入到SSD,并返回成功,之后再后台同步到HDD。会带来一些稳定性风险。
- Write-around 直接写入到HDD。
具体选择哪种模式,取决于业务对磁盘的使用方式。
以下是几种常见的决策方式:
- 如果对稳定性要求不高,但是对性能比较敏感,则应选择 Write-back,因其性能最高。
如果对稳定性有要求,则:
- 若是预期刚写入的数据会被较快重新读,则应使用Write-through,它在写入数据的同时,会在SSD上建立读缓存,后续读的时候速度会比较快。
- 若是很少读之前写入的数据,则应使用Write-around,一方面能加快写入速度(只用写一份),另一方面也避免了无效数据冲刷缓存。
挂载和使用分区
在上述步骤完成后,实际上混合SSD设备(/dev/bcache0) 已经就绪,可以开始使用了,用法和简单的磁盘分区无明显区别。
mkfs.ext4 /dev/bcache0 #格式化磁盘
mount /dev/bcache0 /mnt #挂载磁盘
如果需要把挂载点固化,则需要更新到 /etc/fstab
文件,先查看 /dev/bcache0 的UUID值
blkid
可以看到/dev/bcache0 的UUID值是:
3d144aad-6e42-498b-ac1e-712d31b32c51
编辑更新 /etc/fstab
文件,在底部添加以下命令,使其开机自动挂载
UUID=3d144aad-6e42-498b-ac1e-712d31b32c51 /disk ext4 defaults,nofail 0 0
其他相关命令
查看运行状态
cat /sys/block/bcache0/bcache/state
- no cache:该backing device没有attach任何caching device(这意味着所有I / O都直接传递到backing device[pass-through mode])。
- clean:everything is ok,缓存是干净的。
- dirty:这意味着一切都设置正常,并且您已启用回写,缓存是脏的。
- inconsistent:您遇到问题,因为后台设备与缓存设备不同步。
查看缓存的数据量
cat /sys/block/bcache<n>/bcache/dirty_data
查看/设置缓存模式
- 设置缓存模式(默认writethrough)
echo <cache mode> > /sys/block/bcache0/bcache/cache_mode
- 查看缓存模式
cat /sys/block/bcache0/bcache/cache_mode
[writethrough] writeback writearound none
- 查看缓存统计
cat /sys/class/block/bcache0/bcache/writeback_rate_debug
- 打印device信息
bcache-super-show /dev/sd<n>
- 配置信息
backing device 在 /sys/block/bcache0/bcache/ 目录下
cache device 在 /sys/fs/bcache/
对/sys中配置信息的改变是暂时的,重启会失效。如果想要在启动时设置当前的配置,需要创建一个conf配置文件在/etc/tmpfile.d/中,例如 /etc/tmpfile.d/my-bcache.conf
w /sys/block/bcache0/bcache/sequential_cutoff - - - - 1
w /sys/block/bcache0/bcache/cache_mode - - - - writeback
(To set, in a persistent fashion, the sequential cutoff for bcache0 to 1 MB and write back)
设置成功之后如何优化?可以查看这篇文章
https://blog.lincloud.pro/archives/49.html