我有 3 个 HDD 和 1 个 SSD,我已成功将所有驱动器安装到 bcache。
pavs@VAS:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 132G 35G 90G 28% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 3.9G 8.0K 3.9G 1% /dev
tmpfs 786M 2.3M 784M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 3.9G 152K 3.9G 1% /run/shm
none 100M 52K 100M 1% /run/user
/dev/bcache1 2.7T 2.1T 508G 81% /var/www/html/directlink/FTP1
/dev/bcache2 1.8T 614G 1.2T 36% /var/www/html/directlink/FTP2
/dev/bcache0 1.8T 188G 1.6T 11% /var/www/html/directlink/FTP3
/dev/sdf1 367G 284G 65G 82% /media/pavs/e93284df-e52e-4a5d-a9e1-323a388b332f
正在缓存的驱动器不是操作系统驱动器。三个硬盘,有很多大文件,平均文件大小从 600mb 到 2GB,最小文件大小为 500mb,最大文件大小为 10GB。
这些文件通过 apache 网络服务器不断下载。但即使在频繁访问的文件上,我也只看到 IO 速度略有加快或没有加速。我不知道 bcache 使用什么类型的缓存公式,也不知道是否可以对其进行调整以获得最大缓存性能。理想情况下,我希望看到经常访问的文件至少缓存一天,直到没有对该文件的请求。我不知道是否可以进行这种级别的精细缓存调整。我只关心读取性能,并希望看到 SSD 驱动器的最大利用率。
编辑:根据这。 bcache“不鼓励”顺序缓存,如果我理解正确的话,这对我来说是一个问题,因为我的大多数文件都是大型顺序文件。默认的顺序截止是 4.0M,它可能会阻止文件被缓存(我不知道),所以我通过对每个备份驱动器执行以下操作来禁用截止:
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
现在拭目以待,看看它是否真的能提高性能。
根据 bcache 统计数据,所有三个驱动器都被缓存
缓存0
pavs@VAS:~$ tail /sys/block/bcache0/bcache/stats_total/*
==> /sys/block/bcache0/bcache/stats_total/bypassed <==
461G
==> /sys/block/bcache0/bcache/stats_total/cache_bypass_hits <==
9565207
==> /sys/block/bcache0/bcache/stats_total/cache_bypass_misses <==
0
==> /sys/block/bcache0/bcache/stats_total/cache_hit_ratio <==
63
==> /sys/block/bcache0/bcache/stats_total/cache_hits <==
3003399
==> /sys/block/bcache0/bcache/stats_total/cache_miss_collisions <==
659
==> /sys/block/bcache0/bcache/stats_total/cache_misses <==
1698297
==> /sys/block/bcache0/bcache/stats_total/cache_readaheads <==
0
缓存1
pavs@VAS:~$ tail /sys/block/bcache1/bcache/stats_total/*
==> /sys/block/bcache1/bcache/stats_total/bypassed <==
396G
==> /sys/block/bcache1/bcache/stats_total/cache_bypass_hits <==
9466833
==> /sys/block/bcache1/bcache/stats_total/cache_bypass_misses <==
0
==> /sys/block/bcache1/bcache/stats_total/cache_hit_ratio <==
24
==> /sys/block/bcache1/bcache/stats_total/cache_hits <==
749032
==> /sys/block/bcache1/bcache/stats_total/cache_miss_collisions <==
624
==> /sys/block/bcache1/bcache/stats_total/cache_misses <==
2358913
==> /sys/block/bcache1/bcache/stats_total/cache_readaheads <==
0
缓存2
pavs@VAS:~$ tail /sys/block/bcache2/bcache/stats_total/*
==> /sys/block/bcache2/bcache/stats_total/bypassed <==
480G
==> /sys/block/bcache2/bcache/stats_total/cache_bypass_hits <==
9202709
==> /sys/block/bcache2/bcache/stats_total/cache_bypass_misses <==
0
==> /sys/block/bcache2/bcache/stats_total/cache_hit_ratio <==
58
==> /sys/block/bcache2/bcache/stats_total/cache_hits <==
4821439
==> /sys/block/bcache2/bcache/stats_total/cache_miss_collisions <==
1098
==> /sys/block/bcache2/bcache/stats_total/cache_misses <==
3392411
==> /sys/block/bcache2/bcache/stats_total/cache_readaheads <==
0
答案1
congested_read_threshold_us
我通过设置并congested_write_threshold_us
遵循 bcache 文档解决了同样的问题:
流量仍然进入主轴/仍然出现缓存未命中
在现实世界中,SSD 并不总是能跟上磁盘的速度 - 尤其是速度较慢的 SSD、许多磁盘由一个 SSD 缓存或大部分是顺序 IO。因此,您希望避免成为 SSD 的瓶颈并降低一切速度。
为了避免 bcache 跟踪缓存设备的延迟,并在延迟超过阈值时逐渐限制流量(它通过降低顺序旁路来实现这一点)。
如果需要,您可以通过将阈值设置为 0 来禁用此功能:
# echo 0 > /sys/fs/bcache/<cache set>/congested_read_threshold_us
# echo 0 > /sys/fs/bcache/<cache set>/congested_write_threshold_us
读取的默认时间为 2000 us(2 毫秒),写入的默认时间为 20000。
现在所有磁盘 IO 都发送到我的 SSD(sde):
Device: wrqm/s r/s w/s rkB/s wkB/s await svctm %util
sdb 0.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.10 0.30 0.80 0.00 3.00 3.00 0.12
sdc 0.00 2.20 0.30 26.00 0.00 1.76 1.76 0.44
sda 0.00 0.20 0.20 0.80 0.00 8.00 13.00 0.52
sde 293.20 81.70 232.70 1129.20 58220.00 21.05 3.18 100.00
md1 0.00 2.50 0.30 27.60 0.00 0.00 0.00 0.00
md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
bcache0 0.00 83.00 402.40 1156.80 28994.80 31.70 2.06 99.92