Performance

為什麼我的 RAID1 讀取訪問比寫入訪問慢?

  • July 8, 2014

我做了一些簡單的性能測試,似乎從我的 RAID1 讀取比寫入慢:

root@dss0:~# for i in 1 2 3; do dd if=/dev/zero of=/dev/sda bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 192.349 s, 715 MB/s
137438953472 bytes (137 GB) copied, 192.851 s, 713 MB/s
137438953472 bytes (137 GB) copied, 193.026 s, 712 MB/s
root@dss0:~# for i in 1 2 3; do dd if=/dev/sda of=/dev/null bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 257.201 s, 534 MB/s
137438953472 bytes (137 GB) copied, 255.522 s, 538 MB/s
137438953472 bytes (137 GB) copied, 259.945 s, 529 MB/s

我明白 dd 不是性能測試工具,但是這個結果仍然是一個驚喜。

系統由供應商建構,具有 16 GByte RAM 的 Supermicro 主機板。RAID 控制器是具有 1 GB 高速記憶體的 MegaRAID 9271-8i。SAS-933EL1 背板上有 8 個 2 TB SAS 磁碟。我不確定佈線,控制器的一個連接器連接到 SAS 背板,另一個連接到兩個保存作業系統的 SATA 磁碟。

RAID1 是使用以下命令設置的:

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r1 [8:0,8:1,8:2,8:3,8:4,8:5,8:6,8:7] WB NORA Direct -a0
Adapter 0: Created VD 0
Adapter 0: Configured the Adapter!!
Exit Code: 0x00

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aALL
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 7.275 TB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 7.275 TB
State               : Optimal
Strip Size          : 256 KB
Number Of Drives    : 8
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
PI type: No PI
Is VD Cached: No
Exit Code: 0x00

我希望讀取訪問至少與寫入訪問一樣快,甚至可能更快。715 MByte/sec 的寫入速度似乎接近單個 SAS/SATA 連接器的 6 GBit 限制。這可能是 SAS 背板的配置或佈線問題嗎?SAS背板配置可以用MegaRAID命令查詢嗎?請指教。

更新

正如 poige 和 Peter 所解釋的,讀取性能低於預期可能是由於 Linux I/O 子系統的記憶體造成的。

在 dd 命令中使用直接標誌時,我得到

root@dss0:~# dd if=/dev/sda of=/dev/null bs=1048576 count=131072 iflag=direct
137438953472 bytes (137 GB) copied, 199.862 s, 688 MB/s

這要好得多,但仍然比寫入速度慢 10%。使用 oflag=direct 不會影響寫入速度。

poige 關於寫記憶體的說法完全正確,但這裡有更多細節。

dd 為零並使用寫記憶體不是基準測試的正確方法(當然,除非您想測試寫記憶體,這可能僅對文件系統有用,以查看它同步元數據、創建新文件等的多少。 )(並且可能 dd 總是錯誤的基準測試類型,但它適用於非常基本的測試)

我建議您將 dd 與以下選項中的至少一個一起使用:

conv=fdatasync -> this will make it flush to disk before finishing and calculating speed
oflag=direct   -> this will make it skip the OS cache but not the disk cache
conv=sync      -> more like skipping the disk cache too, but not really ... just flushing it every block or something like that.

也不要使用零。如果數據如此可預測為零,則某些智能硬體/軟體/韌體可能會使用一些快捷方式。如果我猜您沒有使用壓縮,則尤其如此。相反,使用記憶體中的隨機文件(例如 /dev/shm)。urandom 很慢,所以你需要暫時將它寫在某個地方才能再次閱讀。創建一個 50MB 的隨機文件:

dd if=/dev/urandom of=/dev/shm/randfile bs=1M count=50

讀取文件多次寫入(這裡我使用cat讀取6次):

dd if=<(cat /dev/shm/randfile{,,,,,}) of= ... conv=fdatasync

rm /dev/shm/randfile

另請記住,raid1 讀取在並行操作中最快,因此可以獨立使用磁碟。協調磁碟以使用不同磁碟讀取同一操作的不同部分可能不夠聰明。

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