目前手邊有一台 PCI-E Gen 2 的 Server + 6G SAS HBA – LSI 9200-8e + NetApp IOM3 / IOM6 的 JBOD,來試試看 SAS JBOD 的速度距離理想值 6*4=24Gb 會有多大的差距.
不過要注意的瓶頸會有 PCI-E , SAS , JBOD 我們先來一一確定,目前看到 PCI-E Gen2 的速度是沒有問題的.
root@benjr:~# lspci |grep -i lsi 03:00.0 Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (rev 03) root@benjr:~# lspci -n |grep -i 03:00.0 03:00.0 0107: 1000:0072 (rev 03) root@benjr:~# lspci -n -d 1000:0072 -vvv |grep -i width pcilib: sysfs_read_vpd: read failed: Connection timed out LnkCap: Port #0, Speed 5GT/s, Width x8, ASPM L0s, Exit Latency L0s <64ns, L1 <1us LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
資料顯示 5GT/s, Width x8 算出來約 5Gbpsx8 = 40Gbps (20% overhead-PCIe並且在每八個位元的資料串上用十位元來加以編碼)= 32Gbps (4 GB/sec)
- SAS 效能請參考 https://benjr.tw/67963
- PCI-E 請參考 https://benjr.tw/10842
NetApp IOM3 / IOM6 的 JBOD 理想值是.
- 3Gb SAS 1.0 提供約 ~12Gb (3Gb x4 wide port), 8b/10b 編碼 20% 的 overhead 實際有效頻寬為 1.2GB/s
- 6Gb SAS 2.0 提供約 ~24Gb (6Gb x4 wide port), 8b/10b 編碼 20% 的 overhead 實際有效頻寬為 2.4GB/s
連接方式也很簡單 使用 minisas -> QSFP 將 LSI 9200-8e 與 NetApp IOM3 / IOM6 JBOD (方型標誌的連接埠)相連接.
這次我使用了 Fio – https://benjr.tw/34632 當做硬碟效能的測試工具.
root@benjr:~# vi fio.cfg [global] direct=1 iodepth=16 ioengine=libaio numjobs=16 blocksize=512k time_based rw=read runtime=60s group_reporting [dev-sdb] filename=/dev/sdb [dev-sdc] filename=/dev/sdc [dev-sdd] filename=/dev/sdd [dev-sde] filename=/dev/sde [dev-sdf] filename=/dev/sdf [dev-sdg] filename=/dev/sdg [dev-sdh] filename=/dev/sdh [dev-sdi] filename=/dev/sdi [dev-sdj] filename=/dev/sdj [dev-sdk] filename=/dev/sdk [dev-sdl] filename=/dev/sdl [dev-sdm] filename=/dev/sdm [dev-sdn] filename=/dev/sdn [dev-sdo] filename=/dev/sdo
Job 設定檔有兩段,[global] : 共用的設定參數 , [job] :特別指定的參數(這邊指定待測裝置名稱).
參數說明
- direct=1
預設值為 0 ,必須設定為 1 才會測試到真實的 non-buffered I/O - iodepth=16
同一時間有多少 I/O 在做存取,越多不代表存儲裝置表現會更好,通常是 RAID 時須要設大一點. - ioengine=libaio
定義如何跑 I/O 的方式, libaio 是 Linux 本身非同步(asynchronous) I/O 的方式.
其他還有 sync , psync , vsync , posixaio , mmap , splice , syslet-rw , sg , null , net , netsplice , cpuio , guasi , external - numjobs=16
跟前面的 iodepth 類似,但不一樣,在 Linux 下每一個 job 可以生出不同的 processes/threads ,numjobs 就是在同一個 workload 同時提出多個 I/O 請求,通常負載這個會比較大.預設值為 1. - blocksize=512k
bs 或是 blocksize ,也就是檔案寫入大小,預設值為 4K,如何設定這個值,因為不同性質的儲存裝置需要不同的值.看你是 File Server,Web server , Database … 設定都會不一樣. - time_based
測試以時間為單位,另外一種方式是以 kb_base (kilobyte). - rw=read
可以設定的參數如下,通常在跑效能時會使用單純的 read 與 write,其他可以使用參數如下:- read : Sequential reads. (循序讀)
- write : Sequential writes. (循序寫)
- trim : Sequential trim.
- randread : Random reads. (隨機讀)
- randwrite : Random writes. (隨機寫)
- randtrim : Random trim.
- rw : Mixed sequential reads and writes. (循序讀寫)
- readwrite : Sequential read and write mix (循序混合讀寫)
- randrw : Mixed random reads and writes. (隨機讀寫)
- trimwrite : Trim and write mix, trims preceding writes.
- runtime=60s
這一測試所需的時間,單位為 秒. - group_reporting
如果 numjobs 有指定,設定 group_reporting 報告會以 per-group 的顯示方式,而不是預設的 of per-job (會顯示所有個別 numjobs 的測試結果)
我系統一共有 14 顆硬碟.下面是測試結果
IOM3
root@benjr:~# fio fio.cfg Run status group 0 (all jobs): READ: io=62987MB, aggrb=1036.4MB/s, minb=1036.4MB/s, maxb=1036.4MB/s, mint=60776msec, maxt=60776msec
IOM6
root@benjr:~# fio fio.cfg Run status group 0 (all jobs): READ: io=93198MB, aggrb=1548.3MB/s, minb=72689KB/s, maxb=160388KB/s, mint=60110msec, maxt=60195msec
怪了 IOM3 在合理值內,理想值是 3G*4 =12Gb=1.2GB (8b/10b 編碼 20% 的 overhead) ,實測為 1.0364GB,但 IOM6 的值偏低怎麼調整都不對 ,理想值是 6G*4 =24Gb=2.4GB (8b/10b 編碼 20% 的 overhead ) ,實測為 1.5483 GB.
最後去查 Molex’s iPass™ Connector System Offering a full interconnect system that enables flexible speed compatibility for applications up to 14 Gbps.
好像問題是出在 Mini-SAS -> QSFP (iPass) Cable 的支援問題上,似乎這一條線只支援到 14G(1.4GB)
儲存裝置的效能測試 除了 PCI-E , SAS , JBOD 外 連使用的 cable 線材都需要注意.