使用傲腾内存给Linux服务器提升读写性能

由 夏日冰菓 发布

Bcache块缓存使用方式

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

bcache

可以看到/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/<CSET-UUID>/ 目录下

对/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


暂无评论

发表评论