Raid

FIO 基準測試 - 不一致且比預期慢:我的 RAID 是否配置錯誤?

  • February 3, 2021

**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    ║
╚═══════════╩════════════════════════════════╩═════════════╩════════════════════════════╝

儲存詳細資訊

以下是每個儲存後端的更詳細細分:

  1. SATADOMSATADOM由 Proxmox 通過 LVM 直接管理。是來自 的輸出lvdisplay pve。SATADOM 通過內部 DVD-ROM SATA 埠連接到伺服器,因為它在R730xd模型中未使用。
  2. 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 控制器配置

因此,您可能剛剛注意到DataPoolRAIDPool都由 H730 RAID 控制器安裝和管理。但是,DataPool由 Proxmox 通過 ZFSRAIDPool管理,由實際控制器管理。

是物理磁碟拓撲的螢幕截圖。H730 能夠將磁碟直接傳遞到作業系統並同時管理其他磁碟。如您所見,前 6 個磁碟配置為Non-RAIDmode,後 6 個磁碟配置為Onlinemode。

  • 以下是 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。和FlashPoolDataPool 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嗎?相反,您可以看到FlashPoolVM 完成測試所用的時間最長,並且平均寫入頻寬最慢。在寫入 IOPS比較中可以看到相同的情況——平均 IOPS 約為 3,000,FlashPoolVM 執行測試的時間最長!

  • 拋開從虛擬機內部獲取的基準,轉而查看通過直接與虛擬機管理程序的儲存互動所獲取的基準,我們可以看到一些不同的行為。例如,在這個測試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 池的性能會突然大大超過其他所有東西嗎?


問題:

  1. 這些結果是不正常的……對吧?網站的基準測試顯示970 EVO 實現了超過 900MB/s 的隨機寫入速度。為什麼我的在管理程序上只有150MB/s在 VM 上只有 10MB/s?當從虛擬機管理程序和虛擬機進行基準測試時,為什麼這些速度如此不同?
  2. 為什麼RAIDPool從 Hypervisor 進行基準測試時突然變得異常緩慢?在這裡,我們看到 VM 中的讀取頻寬平均為 20MB/s。但是,從管理程序,它改為報告 4MB/s。就像我在問題 1 中展示的基準測試一樣,這些讀取速度不應該接近900MB/s嗎?
  3. 為什麼從虛擬機而不是虛擬機管理程序中進行基準測試時,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 和想法將受到 ZFSrecordsize屬性的嚴重影響,因為 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 層 - 請參閱 XFSdax選項)。

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