![考慮到其他基準測試,並行從軟體 RAID 讀取的速度比「應該」慢](https://rvso.com/image/789250/%E8%80%83%E6%85%AE%E5%88%B0%E5%85%B6%E4%BB%96%E5%9F%BA%E6%BA%96%E6%B8%AC%E8%A9%A6%EF%BC%8C%E4%B8%A6%E8%A1%8C%E5%BE%9E%E8%BB%9F%E9%AB%94%20RAID%20%E8%AE%80%E5%8F%96%E7%9A%84%E9%80%9F%E5%BA%A6%E6%AF%94%E3%80%8C%E6%87%89%E8%A9%B2%E3%80%8D%E6%85%A2.png)
筆記:我在這裡看到了一些類似的問題,但是:
- 它們都不涉及並行讀取許多文件,並且
- 大多數已經有 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 或其他東西它的上游限制了我從這些磁碟讀取的速度。
問題:
- 如何診斷瓶頸在哪裡?
- 我該如何查看這裡的配置選項,還有哪些其他選項?
- 我的設定是否有根本限制,導致我想要做的事情變得不可能?如果是這樣,我可以使用其他配置嗎?
我已經嘗試過的東西
- 調整 的塊大小
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>