FIO 基準測試 - 不一致且比預期慢:我的 RAID 是否配置錯誤?
**TL;DR:**我的管理程序儲存存在一些性能問題。這裡有一堆測試結果來自
fio
. 跳到該Results
部分閱讀它們並查看我的問題。概括
我最近購買了 R730xd,因此在遷移到它之前,我想確保儲存性能最佳。我一直在使用fio進行一些基準測試,並發現了一些令人震驚的結果。使用這些結果和fio-plot的組合,我積累了相當多的圖形和圖表,這些圖表和圖表展示了我的各種儲存後端的問題。
但是,我很難將其轉化為可用資訊,因為我沒有任何東西可以與之比較。而且我認為我遇到了一些非常奇怪的性能問題。
磁碟配置
以下是暴露給我的管理程序 (Proxmox) 的四種儲存類型:
╔═══════════╦════════════════════════════════╦═════════════╦════════════════════════════╗ ║ Storage ║ Hardware ║ Filesystem ║ Description ║ ╠═══════════╬════════════════════════════════╬═════════════╬════════════════════════════╣ ║ SATADOM ║ 1x Dell K9R5M SATADOM ║ LVM/XFS ║ Hypervisor filesystem ║ ║ FlashPool ║ 2x Samsung 970 EVO M.2 SSD ║ ZFS RAID 1 ║ Hypervisor Compute Storage ║ ║ DataPool ║ 6x HGST 7200RPM HDD ║ ZFS RAID 10 ║ Redundant Data Storage ║ ║ RAIDPool ║ 6x Seagate/Hitachi 7200RPM HDD ║ HW RAID 10 ║ General Purpose Storage ║ ╚═══════════╩════════════════════════════════╩═════════════╩════════════════════════════╝
儲存詳細資訊
以下是每個儲存後端的更詳細細分:
- SATADOM:
SATADOM
由 Proxmox 通過 LVM 直接管理。這是來自 的輸出lvdisplay pve
。SATADOM 通過內部 DVD-ROM SATA 埠連接到伺服器,因為它在R730xd
模型中未使用。- FlashPool:這
FlashPool
是一個簡單的 ZFS RAID 1,由雙 NVMe SSD 組成。目標是將其用作我的虛擬機的備份儲存。以下是以下輸出:zpool list zpool status zfs get all
中的每個 SSD都通過安裝在 x16 PCIe 插槽中的PCI-E -> M.2 適配器
FlashPool
連接到伺服器。我知道這些是 x4 PCIe 適配器。但是,我很確定 NVMe 只能以這種速度執行,因此不會製造更快的適配器。 3. DataPool:這DataPool
是唯一預先存在的數據集。它已有幾年的歷史,以前用於數據和 VM 儲存,從而損害了性能。它也由 Proxmox 作為 ZFS RAID 10 進行管理。它最初由
6x 4TB HGST Ultrastar 7K4000 7200RPM
磁碟組成。但是,當它們開始出現故障時,我決定用更高密度的磁碟替換它們。因此,該數組現在包括:2x 6TB HGST Ultrastar He6 7200RPM 4x 4TB HGST Ultrastar 7K4000 7200RPM
我顯然打算最終完全遷移到 6TB 磁碟,因為舊磁碟繼續出現故障。以下是上面發布的相同命令的輸出
FlashPool
。這 6 個磁碟通過背板上的前 6 個托架連接到伺服器。此背板連接到 Dell H730 Mini PERC RAID 控制器。 4. RAIDPool:這
RAIDPool
是一個實驗性的儲存後端。我以前從未使用過硬體 RAID,所以現在我有一個合適的 RAID 控制器,我為這個機會感到興奮。與 類似DataPool
,這些磁碟安裝在背板上的最後 6 個托架中。但是,它們不是傳遞給 Proxmox,而是由 PERC 管理。它們作為單個磁碟呈現給 Proxmox,然後由 LVM 管理並通過邏輯卷作為 XFS 文件系統呈現給作業系統。這是來自 的輸出lvdisplay RAIDPool
。RAID 控制器配置
因此,您可能剛剛注意到
DataPool
和RAIDPool
都由 H730 RAID 控制器安裝和管理。但是,DataPool
由 Proxmox 通過 ZFSRAIDPool
管理,由實際控制器管理。這是物理磁碟拓撲的螢幕截圖。H730 能夠將磁碟直接傳遞到作業系統並同時管理其他磁碟。如您所見,前 6 個磁碟配置為
Non-RAID
mode,後 6 個磁碟配置為Online
mode。
- 以下是 iDRAC UI 中為控制器配置的屬性。
- 為虛擬磁碟 ( ) 上的回寫和預讀啟用磁碟記憶體
RAIDPool
。由於這是專門為 VD 配置的,因此不會影響 ZFS 驅動器。- 非 RAID磁碟的 Dick Cache (ZFS
DataPool
) 設置為Disable
.- 所有驅動器的連結速度設置為
auto
。此外,在再次完成所有設置後,我啟用
Write Cache
了嵌入式 SATA 控制器。因此,這可能會提高SATADOM
以下基準中所見的性能。基準測試:
我以兩種方式對所有這些儲存後端進行了基準測試。對於這兩個測試,我在一個小的 shell 腳本中執行了一系列
fio-plot
命令,將結果轉儲到幾個文件夾中。如果您很瘋狂並且想自己解析原始結果,那麼它們就是. 您需要稍微調整一下我的腳本才能重新執行,因為我在上傳之前移動了目錄結構來組織它。
簡而言之,他們針對每個儲存後端進行了一系列測試,評估了其RANDOM頻寬、IOPS 和延遲。然後它將這些結果繪製在圖表上。一些圖表比較了多個後端。其他圖表僅顯示來自各個後端的結果。我沒有執行任何順序測試。在所有情況下,預設塊大小都用於測試。
**測試 1)**在 Proxmox 中,我將所有儲存後端安裝到
/mnt
目錄中。ZFS 池被簡單地導入作業系統,RAIDPool 和 RAIDPoolSATADOM
都通過 LVM 呈現給作業系統。每個都有一個格式化為 XFS 分區的邏輯卷,用於基準測試。注意:我從實時作業系統執行這些基準測試,因此性能SATADOM
會受到相應影響。使用以下命令生成日誌文件:
./bench_fio --target /mnt/SATADOM_Data/bm --type directory --size 450M --mode randread randwrite --output SATADOM ./bench_fio --target /mnt/RAIDPool_Data/bm --type directory --size 1G --mode randread randwrite --output RAIDPOOL ./bench_fio --target /mnt/DataPool/bm/ --type directory --size 1G --mode randread randwrite --output DATAPOOL ./bench_fio --target /mnt/FlashPool/bm/ --type directory --size 1G --mode randread randwrite --output FLASHPOOL
**測試 2)**我在 Proxmox 中創建了三個虛擬機。
FlashPool
每個都使用與、DataPool
和不同的備份儲存RAIDPool
。和FlashPool
DataPool VM 在它們自己的 ZFS 數據集中執行。VM 在其RAIDPool
自己的厚配置邏輯卷上執行。所有三個虛擬機都被分配了 4 個 vCPU 和 40GB 記憶體。使用以下命令生成日誌文件:
./bench_fio --target /fio --type file --size 1G --mode randread randwrite --duration 600 --output DATAPOOL_VM ./bench_fio --target /fio --type file --size 1G --mode randread randwrite --duration 600 --output RAIDPOOL_VM ./bench_fio --target /fio --type file --size 1G --mode randread randwrite --duration 600 --output FLASHPOOL_VM
結果:
上述 Imgur 連結中的圖表都應按相同的順序排列。兩個基準測試的結果有很大不同。但是,當您考慮到虛擬化的成本時,這是可以預料的。我沒想到的是,它們的行為似乎都差不多。
例如,此圖表顯示,當
fio
從 VM 內執行時,平均寫入頻寬約為 125 MB/s。RAID 1 ( ) 中的兩個 NVMe SSD 不應該FlashPool
大大優於SATADOM
嗎?相反,您可以看到FlashPool
VM 完成測試所用的時間最長,並且平均寫入頻寬最慢。在寫入 IOPS比較中可以看到相同的情況——平均 IOPS 約為 3,000,FlashPool
VM 執行測試的時間最長!拋開從虛擬機內部獲取的基準,轉而查看通過直接與虛擬機管理程序的儲存互動所獲取的基準,我們可以看到一些不同的行為。例如,在這個測試
FlashPool
中,和的寫入頻寬DataPool
高達 400MB/s。但是,RAIDPool
平均性能為 10MB/s 左右。巧合的是,與SATADOM
? 當然,RAIDPool
應該與DataPool
? 鑑於它們由相同 RAID 控制器中存在的類似磁碟組成?與上麵類似,Write IOPS顯示了同樣的離奇故事。來自 Hypervisor 測試的寫入延遲似乎也很不尋常。似乎比 ZFS 池的
RAIDPool
延遲要差十倍?但是,如果你翻到VM 測試,三個儲存後端的延遲似乎集中在 300 微秒左右。這與我們在 WORST 演員陣容中看到的非常相似RAIDPool
。當測試是從虛擬機而不是管理程序執行時,為什麼這種平滑效果會發生在寫入延遲上?為什麼 ZFS 池的延遲突然變得如此糟糕,並且可以與RAIDPool
?查看讀取頻寬、IOPS 和延遲顯示了類似的情況。從 VM 中進行基準測試時,儘管硬體配置大不相同,但所有指標都同樣緩慢。但是,一旦從虛擬機管理程序進行基準測試,ZFS 池的性能會突然大大超過其他所有東西嗎?
問題:
- 這些結果是不正常的……對吧?該網站的基準測試顯示970 EVO 實現了超過 900MB/s 的隨機寫入速度。為什麼我的在管理程序上只有150MB/s而在 VM 上只有 10MB/s?當從虛擬機管理程序和虛擬機進行基準測試時,為什麼這些速度如此不同?
- 為什麼
RAIDPool
從 Hypervisor 進行基準測試時突然變得異常緩慢?在這裡,我們看到 VM 中的讀取頻寬平均為 20MB/s。但是,從管理程序,它改為報告 4MB/s。就像我在問題 1 中展示的基準測試一樣,這些讀取速度不應該接近900MB/s嗎?- 為什麼從虛擬機而不是虛擬機管理程序中進行基準測試時,ZFS 池的性能突然顯著變差?例如,在這裡我們可以看到平均讀取 IOPS 約為 200,000,延遲低於 650us。但是,當從VM 內部進行基準測試時,我們會突然發現讀取 IOPS 平均約為 2,500,延遲增加了四倍多?兩種情況下的表現不應該差不多嗎?
在對 ZFS 池進行基準測試時,您需要了解記憶體和記錄大小如何與您的工作負載互動:
- 您的
fio
命令不會跳過 linux 頁面記憶體(無--direct=1
選項),也不會跳過 ZFS ARC。但是,由於兩者之間的操作模式不同,您可以最終選擇普通文件系統 (XFS) 與 ZFS,反之亦然。為了減輕記憶體效應,我建議您使用比 RAM 值大 2 倍的文件進行基準測試(即:如果有 24 GB 的 RAM,則使用 48 GB 的文件)。不要在禁用記憶體的情況下對 ZFS 進行基準測試(即primarycache=none
:),因為 CoW 文件系統需要高記憶體命中率才能提供良好的性能(尤其是在寫入小於記錄大小的塊時,如下所示);- 您的隨機讀/寫 IOP 和想法將受到 ZFS
recordsize
屬性的嚴重影響,因為 ZFS 通常會傳輸完整的記錄大小的塊(小文件除外,其中“小”表示 < 記錄大小)。換句話說,在fio
讀/寫 4K 塊時,ZFS 實際上為每個請求的4K 塊讀/寫 32K 塊fio
。記憶體可以(並且將會)改變這個通用規則,但重點仍然存在:對於大記錄大小,吞吐量飽和可能是一個問題。請注意,我並不是說 32K 記錄大小是不合理的(儘管我可能會使用 16K 來限制 SSD 的磨損);但是,您需要在評估基準測試結果時考慮它;- 我會為直通磁碟重新啟用物理磁碟記憶體,因為 ZFS 知道如何刷新它們的易失性記憶體。但是,您需要檢查您的 H730P 是否支持直通磁碟的 ATA FLUSHes / FUA(它應該通過同步,但它的手冊在這一點上不清楚,我沒有實際的硬體可以嘗試);
- 您的
RAIDPool
陣列由機械 HDD 組成,因此其隨機讀取性能會很低(控制器記憶體不會幫助您進行隨機讀取)。綜合考慮,我認為您的結果沒有異常;相反,它們並不代表有效的工作量並且被部分誤解。如果您真的想比較 ZFS 和 HWRAID+XFS,我建議您使用實際的預期工作負載(即:數據庫 + 應用程序 VM 做一些有用的工作)進行測試,同時確保使用ThinLVM(而不是傳統的 LVM ) 至少具有與 ZFS 自己的快照/複製功能相當的快速快照功能。
但是,從某種意義上說,你可以避免做這些測試,僅僅因為結果是可以預測的:
- 簡單的 HWRAID+LVM+XFS 設置對於適合 linux 頁面記憶體的數據集的順序 IO 和隨機讀/寫將更快:不受 CoW 影響,它支付的成本比 ZFS 小得多;
- ZFS 設置在實際場景中會更快,因為 ARC 的抗掃描特性將確保最常用的數據始終保持記憶體。此外,壓縮和校驗和是兩個殺手級功能(要具有與HWRAID 類似的功能,您需要使用堆疊
dm-integrity
++設置,這本身會帶來很大的性能損失)。vdo``thinlvm
作為參考,我最近用更便宜的 SuperMicro 5029WTR 替換了配備 H710P + 12 個 10K RPM SAS 磁碟的 Dell R720xd,配備 2x SSD(用於引導和 L2ARC)+ 1x NVMe Optane(用於 SLOG)和 6x 7.2K RPM SATA 磁碟. SuperMicro 系統的隨機讀取性能只有戴爾系統的 1/3,但由於 ARC/L2ARC 和壓縮,它的性能要好得多。
最後,雖然我完全理解使用經典 HWRAID+LVM+XFS 系統的動機,但我不會再使用它而不是 ZFS 將裸機機器用作虛擬機管理程序(除非針對特定的工作負載,這些工作負載真的很糟糕)介於兩者之間或需要極速和 DirectIO 時的 CoW 層 - 請參閱 XFS
dax
選項)。