Ssd

優化 bcache

  • June 29, 2021

我有 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 stats 所有三個驅動器都被記憶體

bcache0

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

bcache1

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

bcache2

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

我通過設置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

引用自:https://unix.stackexchange.com/questions/156102