优化bcache

bra*_*ran 5 ssd bcache

我有 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
Run Code Online (Sandbox Code Playgroud)

正在缓存的驱动器不是操作系统驱动器。三块硬盘有很多大文件,平均文件大小从600mb到2GB,最小的文件大小为500mb,最大的为10GB。

这些文件正在通过 apache 网络服务器不断下载。但即使在经常访问的文件上,我也只看到轻微的 IO 加速或没有加速。我不知道 bcache 使用什么类型的缓存公式,或者是否可以对其进行调整以获得最大缓存性能。理想情况下,我希望看到经常访问的文件被缓存一天,直到没有对该文件的请求。我不知道这种级别的细粒度缓存调整是否可行。我只关心读取性能,并希望看到 SSD 驱动器的最大利用率。


编辑:根据这个。bcache“不鼓励”顺序缓存,如果我理解正确,这对我来说是一个问题,因为我的大多数文件都是大型顺序文件。默认的顺序截止是 4.0M,它可能阻止了文件被缓存(我不知道),所以我通过为每个备份驱动器执行此操作来禁用截止:

echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
Run Code Online (Sandbox Code Playgroud)

现在等待,看看它是否真的提高了性能。


根据 bcache stats,所有三个驱动器都被缓存

缓存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
Run Code Online (Sandbox Code Playgroud)

缓存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
Run Code Online (Sandbox Code Playgroud)

缓存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
Run Code Online (Sandbox Code Playgroud)

Jet*_* Yu 7

我通过设置congested_read_threshold_uscongested_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
Run Code Online (Sandbox Code Playgroud)