8 個 SSD 磁碟機的軟體 RAID10 陣列寫入效能差

8 個 SSD 磁碟機的軟體 RAID10 陣列寫入效能差

我的伺服器配備 Supermicro X10DRW-i 主機板和 8 個 KINGSTON SKC400S SSD 的 RAID10 陣列;作業系統是CentOS 6

  # cat /proc/mdstat 
Personalities : [raid10] [raid1] 

md2 : active raid10 sdj3[9](S) sde3[4] sdi3[8] sdd3[3] sdg3[6] sdf3[5] sdh3[7] sdb3[1] sda3[0]
      3978989568 blocks super 1.1 512K chunks 2 near-copies [8/8] [UUUUUUUU]
      bitmap: 9/30 pages [36KB], 65536KB chunk

  # mdadm --detail /dev/md2                
    /dev/md2:
            Version : 1.1
      Creation Time : Wed Feb  8 18:35:14 2017
         Raid Level : raid10
         Array Size : 3978989568 (3794.66 GiB 4074.49 GB)
      Used Dev Size : 994747392 (948.67 GiB 1018.62 GB)
       Raid Devices : 8
      Total Devices : 9
        Persistence : Superblock is persistent

      Intent Bitmap : Internal

        Update Time : Fri Sep 14 15:19:51 2018
              State : active 
     Active Devices : 8
    Working Devices : 9
     Failed Devices : 0
      Spare Devices : 1

             Layout : near=2
         Chunk Size : 512K

               Name : ---------:2  (local to host -------)
               UUID : 8a945a7a:1d43dfb2:cdcf8665:ff607a1b
             Events : 601432

        Number   Major   Minor   RaidDevice State
           0       8        3        0      active sync set-A   /dev/sda3
           1       8       19        1      active sync set-B   /dev/sdb3
           8       8      131        2      active sync set-A   /dev/sdi3
           3       8       51        3      active sync set-B   /dev/sdd3
           4       8       67        4      active sync set-A   /dev/sde3
           5       8       83        5      active sync set-B   /dev/sdf3
           6       8       99        6      active sync set-A   /dev/sdg3
           7       8      115        7      active sync set-B   /dev/sdh3

           9       8      147        -      spare   /dev/sdj3

我注意到寫入速度非常糟糕,甚至無法接近 SSD 的效能。

# dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=dsync      
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 16.511 s, 65.0 MB/s

不過讀取速度還是不錯的

# hdparm -tT /dev/md2

/dev/md2:
 Timing cached reads:   20240 MB in  1.99 seconds = 10154.24 MB/sec
 Timing buffered disk reads: 3478 MB in  3.00 seconds = 1158.61 MB/sec

在對這個問題進行了一些故障排除後,我發現我最初可能搞亂了儲存配置:X10DRW-i 採用 Intel C610,它有兩個獨立的 SATA 控制器:6 連接埠 SATA 和 4 連接埠 sSATA。所以陣列中的磁碟連接到不同的控制器,我相信這是效能不佳的根本原因。我只有一個解決此問題的想法:安裝 PCIe SAS 控制器(可能是 AOC-S3008L-L8E)並將 SSD 驅動器連接到它。

所以我想確認以下幾點:

我對根本原因的看法是否正確,或者我應該仔細檢查某些內容?

我的解決方案有效嗎?

如果我將磁碟機重新連接到新控制器,我的 RAID 和資料還會保留嗎?我的研究表明是的,因為分區的 UUID 將保持不變,但我只是想確定一下。

先感謝大家。

UPD:iostat -x 1執行 dd 測試時:https://pastebin.com/aTfRYriU

# hdparm /dev/sda                                    

/dev/sda:
 multcount     = 16 (on)
 IO_support    =  1 (32-bit)
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 124519/255/63, sectors = 2000409264, start = 0

# cat /sys/block/md2/queue/scheduler                 
none

儘管 AFAIK 調度程序設置在實體驅動器上:

# cat /sys/block/sda/queue/scheduler 
noop anticipatory [deadline] cfq 

smartctl -a(在設備上,而不是分區上):https://pastebin.com/HcBp7gUH

更新2:

# dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 14.389 s, 74.6 MB/s

更新3:

fstrim我剛剛在 / 分區上運行並得到一些結果,連續五次測試仍然寫入速度太低:227MB/s、162MB/s、112MB/s、341MB/s、202MB/s。

答案1

測量到的低性能是多種因素造成的:

  • 建立後,陣列完全同步,導致大多數(如果不是全部)快閃記憶體資料頁分配到一半的 SSD 上。這將使 SSD 處於低效能狀態,直到安全擦除/修剪「釋放」所有/大多數/某些頁面。這解釋了 ; 後性能的提高fstrim
  • (預設)512 KB 區塊大小對於最大順序/串流效能來說太大了(以 為基準dd)。對於全 SSD 陣列,我會選擇 64 KB 區塊大小,並且可能(但這應該透過實際測試來確認)採用「遠」佈局。請注意,減小塊大小雖然有利於流式訪問,但可能會損害隨機讀取/寫入。這主要是 HDD 的問題,但即使是 SSD 也會受到一定影響;
  • 預設情況下,Linux 核心最多發出 512 KB 大小的 I/O。這意味著,即使要求dd使用 1 GB 區塊(根據您的第一個命令),這些區塊也會被分割為無數 512 KB 大小的請求。再加上 512 KB 大小的塊,這將吸引每個寫入請求單一 SSD,基本上限制了單 SSD 層級的流寫入效能,並否認 RAID 帶來的任何潛在速度提升。雖然您可以使用max_sectors_kb可調參數(在 參考資料中找到/sys/block/sdX/queue/max_sectors_kb),但大於 512 KB 的值可以(在某些配置/內核版本中)被忽略;
  • 最後,雖然很有趣且強制性的第一站,但dd它本身就是一個糟糕的基準:它只測試低 (1) 佇列深度的串流性能。即使使用目前的陣列配置,更全面的測試也會fio顯示相對於單磁碟場景的顯著效能提升,至少在隨機 I/O 方面。

你能做些什麼來糾正目前的情況?首先,你必須接受擦除磁碟/陣列;顯然,你需要將備份作為第一步。然後:

  • 停止並刪除數組 ( mdadm -S /dev/md2)
  • 修剪全部資料塊上任何磁碟 ( blkdiscard /dev/sdX3)
  • 使用 64 KB 區塊重新建立數組並使用乾淨的旗幟 (mdadm --create /dev/md2 --level=10 --raid-devices=8 --chunk=64 --assume-clean /dev/sdX3
  • dd用和重新換座fio
  • 如果一切正常,請恢復您的備份。

關於 SATA 設定的最後一個注意事項:顯然應該避免以這種方式分割磁碟,以獲得最大效能。也就是說,你的寫入速度太低了,我不會怪你的 SATA 控制器。在購買任何新東西之前,我真的會按照上述說明重新創建數組。

相關內容