Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。由于SSD价格昂贵,存储空间小,而HDD价格低廉,存储空间大,因此采用SSD作为缓存,HDD作为数据存储盘,既解决了SSD容量太小,又解决了HDD运行速度太慢的问题。
Bcache是从Linux-3.10开始正式并入内核主线的,因此,要使用Bcache,需要将内核升级到3.10及以上版本才行。
Bcache支持三种缓存策略,分别是:writeback、writethrough、writearoud,默认使用writethrough,缓存策略可动态修改。
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则没有帮助。
1 2 | sudo apt-get update sudo apt-get install bcache-tools |
---|
假设我们的HDD设备为/dev/sdb, SSD设备为/dev/sdc,我们需要用SSD加速HDD
1 2 | # wipefs -a /dev/sdb # wipefs -a /dev/sdc |
---|
1 | make-bcache -B /dev/sdb |
---|
1 | make-bcache -C /dev/sdc -b1M --writeback |
---|
要为bcache后端磁盘添加缓存盘,在创建缓存盘成功之后,首先需要获取该缓存盘的cset.uuid
1 2 3 4 | # ls /sys/fs/bcache/ 5d9e80f1-e4b7-48f5-ace2-f2f391877ea7 # bash -c 'echo 5d9e80f1-e4b7-48f5-ace2-f2f391877ea7 > /sys/block/bcache0/bcache/attach' |
---|
注意,写入UUID必须以root身份才能执行,在zsh里面sudo可能会出现权限不够的问题,所以直接用bash -c
来做
1 2 3 4 5 6 7 8 | # lsblk sdb 8:16 0 1000G 0 disk └─bcache0 251:0 0 1000G 0 disk sdc 8:32 0 300G 0 disk └─bcache0 251:0 0 1000G 0 disk ls /sys/block/sdb/bcache/dev/slaves |
---|
1 2 3 | # cat /sys/block/bcache0/bcache/cache_mode [writethrough] writeback writearound none |
---|
1 2 3 4 | # echo writeback > /sys/block/bcache0/bcache/cache_mode # cat /sys/block/bcache0/bcache/cache_mode writethrough [writeback] writearound none |
---|
1 2 3 | # cat /sys/block/bcache0/bcache/dirty_data 4.1G |
---|
1 2 | # mkfs.ext4 /dev/bcache0 # mount /dev/bcache0 /opt |
---|
1 | echo "/dev/bcache0 /opt ext4 rw 0 0" >> /etc/fstab |
---|
1 | # fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest |
---|
1 | umount /dev/bcache0 |
---|
1 | echo 1 >/sys/fs/bcache/5d9e80f1-e4b7-48f5-ace2-f2f391877ea7/unregister |
---|
1 | echo 1 > /sys/block/bcache0/bcache/stop |
---|
1 | # lsblk /dev/sdb |
---|
停用之后,后端磁盘的数据是不会丢的,只不过加速功能没有了;当然,注销缓存盘的时候,缓存盘不能有数据读写操作
https://wiki.ubuntu.com/ServerTeam/Bcache
https://askubuntu.com/questions/523817/how-to-setup-bcache
https://markrepo.github.io/maintenance/2018/09/10/bcache/