Zfs

兩個 HDD 上的 ZFS 慢速擦除

  • January 23, 2021

該池由配置中的兩個 HDD(WD Red 3 TB,5200 RPM?,最大傳輸速率 147 MB​​/s 和 Verbatim (Toshiba) 3 TB,7200 RPM)組成raidz1-0。它有 2.25 TB 的數據,複製到兩個磁碟,因此總量為 4.5 TB。創建池時,我沒有指定ashift值。

zpool status顯示“掃描:在 2021 年 1 月 3 日星期日 13:58:54 的 32h43m 中以 0 個錯誤修復了 0”。這意味著掃描速度只有4.5e6 / (32.717 * 60 * 60) = 38.2 MB / s. 我預計至少 2 x 100 或高達 2 x 200 MB/s,儘管 WD 磁碟比另一個磁碟慢一些。

磁碟的 SMART 數據顯示一切正常。它們有 6.5 - 7 年的通電時間,但啟停次數僅為 200 次左右。

所以主要問題是:什麼可以解釋糟糕的讀取性能?

奇怪zdb的是,池使用路徑/dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1而不是/dev/disk/by-id/ata-WDC_WD30EFRX-xyz. fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyz提到“分區 1 不是從物理扇區邊界開始”,但我讀到它只會損害寫入性能。我可能會嘗試通過刪除設備並使用正確的全磁碟路徑將其添加回來來解決此問題,因為數據是重複的(並已備份)。

該池有 710 萬個文件。我sha1sum在通過 清除記憶體後測試了在 14276 MB 文件上執行/proc/sys/vm/drop_caches,花了 2 分 41 秒將讀取速度設置為 88.5 MB/s。

dd bs=1M count=4096 if=/dev/disk/by-id/ata-WDC_WD30EFRX-xyz of=/dev/null報告了 144 MB/s 的速度,使用它ata-WDC_WD30EFRX-xyz-part1報告了 134 MB/s 和ata-TOSHIBA_DT01ACA300_xyz報告了 195 MB/s。

我的 NAS 執行相當舊的軟體版本:

$ modinfo zfs
filename:       /lib/modules/3.11.0-26-generic/updates/dkms/zfs.ko
version:        0.6.5.4-1~precise
license:        CDDL
author:         OpenZFS on Linux
description:    ZFS
srcversion:     5FC0B558D497732F17F4202
depends:        spl,znvpair,zcommon,zunicode,zavl
vermagic:       3.11.0-26-generic SMP mod_unload modversions 

它有 24 GB 的 RAM,其中 8 GB 是為 JVM 保留的,其餘的可以免費使用。雖然似乎沒有多少是免費的:

$ free -m
            total       used       free     shared    buffers     cached
Mem:         23799      21817       1982          0        273       1159
-/+ buffers/cache:      20384       3415
Swap:         7874         57       7817

編輯 1

bonnie++使用 RAIDZ 上的單個 4 GB 文件進行了一些測試:寫入 75.9 MB/s、重寫 42.2 MB/s 和讀取 199.0 MB/s。我假設我從“千字元/秒”正確地進行了轉換。

啊,剛才我意識到並行擦洗所需的時間與最慢的 5400 RPM 磁碟一樣長,7200 RMP(可能)擦洗得更快並不重要。

編輯 2

我將池中的文件數量從 710 萬個減少到 450 萬個(-36.6%),清理時間從 32.72 小時減少到 16.40 小時(-49.9%)。數據量是相同的,因為我只是將這些小文件放入低壓縮的 ZIP 中。

我還將recordsize從 128k 增加到 512k,不知道這在這種情況下是否有所不同。其他預先存在的數據沒有被觸及,因此它們保留了原始recordsize. 哦,/sys/module/zfs/parameters/zfs_scan_idle被設置為2

您正在執行什麼版本的 ZFS?

Pre-0.8.x 通過遍歷所有元數據和數據進行清理,因為它們被佈置在磁碟上。這會導致許多導致機械磁碟性能下降的尋軌。如果與填充了數百萬個小文件的低性能 5K RPM 磁碟一起使用,這意味著很長的清理/重新同步時間。使用這些較舊的 ZFS 版本,您可以調整一些 ZFS 可調參數;例如

echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 0 > /sys/module/zfs/parameters/zfs_scan_idle

請注意,提高畫質理優先級會導致應用程序性能下降。

0.8.x 使用批量清理方法,其中元數據以較大的批次收集,然後才掃描相關數據。這導致更快(即:一半的時間)擦洗,無需調整任何東西(上面的旋鈕甚至不再存在)。

因此,提高畫質理/重新同步速度的更有效方法可能是更新您的 ZFS 版本。

引用自:https://serverfault.com/questions/1049974