前言
当我们使用独立服务器时常常会在大容量存储和高速的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:
A Write-Back cache with Write Allocation:
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读写性能提升效果之大不用多说,看数据就知道
文章有(4)条网友点评
很不错。已经学会了,就是缺一台服务器
感谢老哥提供新的思路,如果两块儿nvme➕两块儿hdd,前两个固态不做raid 机械组raid0这种可以做么,我看HZ貌似都是统一配置
@ AlexAn 可以是可以但是我也不会配置这个。debian/Ubuntu下不怎么会弄,Freenas这种就比较方便但是用起来肯定没平常用的系统熟悉。
好的,刚才看了一下官方文档 貌似也没有解释单独配置raid的方案
。如果这种方案可行的话 可以对单独的机械硬盘提升很大的效率