考慮到其他基準測試,並行從軟體 RAID 讀取的速度比「應該」慢

考慮到其他基準測試,並行從軟體 RAID 讀取的速度比「應該」慢

筆記:我在這裡看到了一些類似的問題,但是:

  1. 它們都不涉及並行讀取許多文件,並且
  2. 大多數已經有 10 多年的歷史,並涉及不再相關的硬體和核心版本。

背景:

我有一台 Linux 機器(Ubuntu,核心 5.15.0-82-generic),有兩個 128 核心 CPU 和 128 GB RAM。它有一個由 10 個 SSD 連接的 RAID 5 陣列,每個 SSD 的額定讀取速度高達 530 MB/s。這些在使用時實際上是唯讀的(它們主要在白天使用,每晚都會添加新數據)。我的一般問題是為數十個核心並行提供磁碟中的資料。

基準測試程序

我透過運行實例來對讀取進行基準測試

dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576

iostat與和並行iotop。在運行之間我透過運行清除緩存

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

我相信這可以正常工作,因為如果我不這樣做,那麼對熱文件的後續讀取幾乎立即完成,然後一旦我這樣做,讀取該文件就會恢復到與以前相同的性能。

基準測試結果

如果我透過軟體 RAID 讀取單個文件,我會得到 500 - 700 MB/s 之間的讀取速率,並且查看輸出,iostat我發現完成此操作的方式是從10 個驅動器中的每一個讀取取並行速度基本上完全相同。

如果我直接從驅動器中讀取(即,如果我提供/dev/sda/dev/sdb等作為if=的參數dd),那麼我能夠以每個530MB/s 的速度並行讀取每個驅動器(即從所有10 個驅動器中讀取1GB 所所需的時間完全相同)從其中一個讀取 1GB 的時間量。

但是,如果我嘗試透過軟體 RAID 並行讀取多個文件,則會出現非常嚴重的效能下降。如果我透過軟體 RAID 並行讀取 10 個文件,那麼各個文件的讀取速度可達 150 到 350 MB/秒,只要直接從磁碟機複製相同數量的數據,整個過程大約需要 4 倍的時間。

此外,根據 iotop 的報告,軟體讀取的讀取速度似乎遇到了絕對瓶頸,總讀取速度約為 2.7 GB/s。

我認為為了給所有核心提供足夠的磁碟資料以免浪費,我可能需要遷移到 NVMe 而不是 SATA,但我想首先解決這個問題,因為它似乎是軟體 RAID 或其他東西它的上游限制了我從這些磁碟讀取的速度。

問題:

  1. 如何診斷瓶頸在哪裡?
  2. 我該如何查看這裡的配置選項,還有哪些其他選項?
  3. 我的設定是否有根本限制,導致我想要做的事情變得不可能?如果是這樣,我可以使用其他配置嗎?

我已經嘗試過的東西

  • 調整 的塊大小dd,使其變大或變小,都沒有效果。
  • 設定 RAID 預讀和/或條帶快取大小無效
  • 將核心升級到稍新的版本可能會嚴重損害基準測試結果,基本上將總吞吐量限制在 500 MB/s IIRC。

附錄:

iostat -k 1基準測試運行期間的範例輸出:https://pastebin.com/yuWwWbRU

內容/proc/mdstat

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
      70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
      bitmap: 0/59 pages [0KB], 65536KB chunk

unused devices: <none>

相關內容