
我的伺服器配備 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 控制器。在購買任何新東西之前,我真的會按照上述說明重新創建數組。