前言

当我们使用独立服务器时常常会在大容量存储和高速的IO读写之中纠结,一般情况下我们选择独立服务器之时都可以选择添加额外的配置。当一个服务器拥有SSD(速度)和HDD(容量)之时我们为何不结合两者呢?以前我用台式电脑win10的时候用过一个软件可以利用内存和SSD加速HDD,这样可以做到速度和容量并存,十分的好用。所以当我搜索linux上的类似软件之时发现有现成的那就是——Bcache。只要短时间内读写不超过SSD的缓存那么就能一直保持一个较高的读写速度。而hetzner这种廉价并且高性能的独立服务器是真的适合拿来练手。

前置工作

Hetzner官网

我选择的是AX41-NVME这款然后添加了一个12TB的HHD(18O)。一个月就是52O,还算可以,毕竟2块512G NVME可以一块做系统盘一块做缓存盘正合适。

购买之后上网搜一个开机安装系统的教程就行,记住不要开启raid!!!如果开启过raid记得进行一下下面的清除raid分区的操作。没有就不需要。

三块硬盘
12TB HDD /dev/sda 数据盘
512GB NVME *2
/dev/nvme0n1 系统盘
/dev/nvme1n1 缓存盘
清除raid分区

parted /dev/sda 
mklabel gpt


格式化分区

mkfs.ext4 /dev/nvme1n1p1

数据盘和缓存盘都格式化一遍。
查看硬盘分区情况

lsblk

Bcache

Bcache简介

Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD/nvme作为缓存盘。由于SSD价格昂贵,存储空间小,而HDD价格低廉,存储空间大,因此采用SSD作为缓存,HDD作为数据存储盘,既解决了SSD容量太小,又解决了HDD运行速度太慢的问题。对于使用linux建站的站长来说,使用Bcache最大的作用应该是提升HDD的小文件读写性能。对于一些图片,文本文档,切片视频,或者是cdn缓存服务器性能提升可谓巨大。
注:Bcache是从Linux-3.10开始正式并入内核主线的,因此,要使用Bcache,需要将内核升级到3.10及以上版本才行。

Bcache 缓存策略

Bcache支持三种缓存策略,分别是:writeback、writethrough、writearoud,默认使用writethrough,缓存策略可动态修改。

  • writeback 回写策略:回写策略默认是关闭的,如果开启此策略,则所有的数据将先写入缓存盘,然后等待系统将数据回写入后端数据盘中。
  • writethrough 写通策略:默认的就是写通策略,此模式下,数据将会同时写入缓存盘和后端数据盘。
  • writearoud :选择此策略,数据将直接写入后端磁盘。

Write-misses写缺失(写入的数据不在缓存中)有两种处理方式:

  • Write allocate方式将写入位置读入缓存,然后采用write-hit(缓存命中写入)操作。写缺失操作与读缺失操作类似。
  • No-write allocate方式并不将写入位置读入缓存,而是直接将数据写入存储。这种方式下,只有读操作会被缓存。

无论是Write-through还是Write-back都可以使用写缺失的两种方式之一。只是通常Write-back采用Write allocate方式,而Write-through采用No-write allocate方式;因为多次写入同一缓存时,Write allocate配合Write-back可以提升性能;而对于Write-through则没有帮助。
缓存处理流程图:

A Write-Through cache with No-Write Allocation:

writethrough-nowrite-allocate.png

A Write-Back cache with Write Allocation:

writeback-write-allocate.png

bcache-tools的安装与使用

1 加载系统的bcache模块:

lsmod | grep bcache


如果出现:

FATAL: Module bcache not found

则需要升级内核,因为bcache在kernel 3.10版本才进入主线,所以我们要保证CentOS的内核版本大于3.10。

要使用Bcache还得安装bcache-tools,因为我用的是CentOS 7系统,自带的源没有bcache-tools,所以我们要手动下载源码包进行编译。bcache依赖libblkid-devel也要装上。
2 编译安装

yum install -y git gcc-c++ pkgconfig libblkid-devel
git clone https://evilpiepirate.org/git/bcache-tools.git
cd bcache-tools/
make
make install

bcache-tools的使用

使用前要确保数据盘和缓存盘都没有数据,否则会提示

make-bcache -B /dev/sda
Device /dev/sda already has a non-bcache superblock, remove it using wipefs and wipefs -a

出现这种提示就按照提示用wipefs -a命令擦除磁盘中的superblock数据即可。

wipefs -a /dev/sda


创建Bcache数据盘(HDD):

make-bcache -B /dev/sda


创建Bcache缓存盘(SSD/nvme):

wipefs -a /dev/nvme1n1
make-bcache -C /dev/nvme1n1


此时输入lsblk,你应该会看见sda下出现bcache0分区
lsblk /dev/sda
然后挂载bcache0这个分区至mnt目录下

mount /dev/bcache0 /mnt

为数据盘配置缓存盘

前面我们已经创建了缓存盘,现在需要获取到缓存盘的cest.uuid,可以通过下面命令查看:

bcache-super-show /dev/nvme1n1


将cest.uuid attach至bcache磁盘即可。

echo "9514318c-8c46-4567-bdf3-6244db87f4ec" 
>/sys/block/bcache0/bcache/attach 

此时就已经成功添加缓存盘了

你也可以快速创建数据盘和缓存盘,并且自动绑定两者的关系。

make-bcache -B /dev/sda1 -C /dev/nvme1n1 --wipe-bcache

删除缓存盘

将缓存盘从当前的后端磁盘删除,只需将缓存盘的cset.uuid detach到bcache磁盘即可实现,命令如下:

echo "9514318c-8c46-4567-bdf3-6244db87f4ec" >/sys/block/bcache0/bcache/detach 

注销缓存盘

注销缓存前,请先确保当前缓存盘没有作为缓存使用,即通过lsblk看不到缓存磁盘下面的bcahe设备,如果当前磁盘正在使用,而进行注销操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。 通过缓存盘的cset.uuid,在/sys/fs/bcache//unregister写入1,即可进行注销操作,操作如下:

cho 1>/sys/fs/bcache/9514318c-8c46-4567-bdf3-6244db87f4ec/unregister

开机自动挂载

一行代码搞定

echo "`blkid /dev/bcache0 |awk '{print $2}'|sed  's/\"//g'`    /mnt                       ext4     defaults        0 0" >>/etc/fstab 

参数配置

我这里不过多介绍参数,有兴趣的可以自己去搜索一下然后根据自己的业务需求来配置,我自己用的参数是这样的。
1、采用writeback模式

echo writeback > /sys/class/block/bcache0/bcache/cache_mode

2、关闭sequence_cutoff

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

测试效果

HDD 测试

+-----------+-----------+----------+-----------+----------+
| Test Item | 读取 IOPS | 读取速度 | 写入 IOPS | 写入速度 |
+-----------+-----------+----------+-----------+----------+
| Seq-Q32T1 |      4621 | 577 MB/s |      1304 | 163 MB/s |
| Seq       |       245 | 245 MB/s |        98 |  98 MB/s |
| 4K-Q32T1  |      1266 |   4 MB/s |       386 |   1 MB/s |
| 4K        |       171 | 685 KB/s |       121 | 487 KB/s |
+-----------+-----------+----------+-----------+----------+

writeback模式

echo writeback > /sys/class/block/bcache0/bcache/cache_mode
+-----------+-----------+----------+-----------+----------+
| Test Item | 读取 IOPS | 读取速度 | 写入 IOPS | 写入速度 |
+-----------+-----------+----------+-----------+----------+
| Seq-Q32T1 |      1820 | 227 MB/s |      1836 | 229 MB/s |
| Seq       |       164 | 164 MB/s |       228 | 228 MB/s |
| 4K-Q32T1  |       621 |   2 MB/s |    102480 | 400 MB/s |
| 4K        |       179 | 718 KB/s |     40876 | 159 MB/s |
+-----------+-----------+----------+-----------+----------+

优化

nvme 缓存之后
关闭sequence_cutoff

echo 0 > /sys/class/block/bcache0/bcache/sequential_cutoff
+-----------+-----------+-----------+-----------+-----------+
| Test Item | 读取 IOPS |  读取速度 | 写入 IOPS |  写入速度 |
+-----------+-----------+-----------+-----------+-----------+
| Seq-Q32T1 |      5207 |  650 MB/s |     25206 | 3.08 GB/s |
| Seq       |      1539 | 1.50 GB/s |      2618 | 2.56 GB/s |
| 4K-Q32T1  |    174297 |  680 MB/s |     91101 |  355 MB/s |
| 4K        |     21170 |   82 MB/s |     39506 |  154 MB/s |
+-----------+-----------+-----------+-----------+-----------+

4K读写性能提升效果之大不用多说,看数据就知道