1. 程式人生 > >叢集搭建完成簡要測試叢集(效能)頻寬與IOPS

叢集搭建完成簡要測試叢集(效能)頻寬與IOPS

> 叢集搭建好之後網路,raid卡策略,磁碟都會影響叢集的效能。為了避免因上述問題使得叢集的效能受到影響,我們依次進行測試,最後得到基本的叢集效能。 ## 網路 首先是網路,ceph叢集一大堆讓人摸不著頭腦的問題都出在網路上,所以我們在建立叢集之前就可以測試網路,看其是否有問題,可以通過ping命令來測試網路的連通性,但最好使用iperf,測試下網路傳輸速度。 遇到有不少現場情況,因為光模組導致萬兆網路只有百兆的速度,如果等叢集建好之後效能不如意,花費大量時間排查發現是這個問題就太冤了。 #### iperf命令 選擇一個節點作為iperf server ```bash iperf -s ``` 選擇其他節點作為iperf client,比如server IP地址為192.168.12.4 ```bash iperf -c 192.168.12.4 -i 1 -t 5 # -i: 間隔多少秒報告一次結果 # -t: 向伺服器傳送多少秒 # 結果如下 [ 3] 0.0- 1.0 sec 575 MBytes 4.83 Gbits/sec [ 3] 1.0- 2.0 sec 361 MBytes 3.03 Gbits/sec [ 3] 2.0- 3.0 sec 618 MBytes 5.18 Gbits/sec [ 3] 3.0- 4.0 sec 423 MBytes 3.55 Gbits/sec [ 3] 4.0- 5.0 sec 519 MBytes 4.35 Gbits/sec [ 3] 0.0- 5.0 sec 2.44 GBytes 4.19 Gbits/sec # 最後一行為 0-5秒的平均速度 ``` `iperf -c 192.168.12.4 -i 1 -t 10 |awk '/sec/ {print $8,9}'` 一般ceph的內部通訊網路是萬兆網路,那通過iperf測試的速度為8-9Gbits/sec為正常,一次測試每個節點,沒問題後接下來檢查raid卡cache策略 ## raid卡cache策略 基於megacli的raid相關操作可參考我的[《Raid操作與壞盤診斷》](https://www.cnblogs.com/tongh/p/12115646.html) 總之,如果有BBU,設定raid cache為No Write Cache if Bad BBU ```bash # 檢視是否存在BBU /opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -aAll # 設定為No Write Cache if Bad BBU,即BBU損壞或learning時變為Write Through /opt/MegaRAID/MegaCli/MegaCli64 -LDSetProp -NoCachedBadBBU -Immediate -Lall -aAll ``` ## 測試頻寬與IOPS > 頻寬和IOPS測試的時候要同時使用atop來看當前測試壓力的瓶頸在哪裡,以三節點叢集為例,通常使用兩臺節點同時往叢集寫入資料就可以測出最大效能,但是如果硬體裝置配置很高,這時候atop觀察發現兩臺同時給壓力叢集還是沒有滿負荷跑,可以使用三個節點同時壓: > > * 通常頻寬使用1M的資料塊來順序寫測試,IOPS使用4K小檔案隨機寫來測試 > > * 頻寬測試的瓶頸往往在萬兆網絡卡上,atop命令可以看到萬兆卡被壓紅 > * IOPS的瓶頸往往在磁碟上,atop可以看到不同節點的磁碟輪番被壓紅,或者同時壓紅則正常。如果發現有一個節點始終沒有太大的變化,就需要去排查分析是否有問題 > * 注意無論是dd命令還是fio命令,都不要對系統盤寫,尤其是直接對系統塊裝置寫,會直接抹掉系統資料。 #### 頻寬 以叢集提供的NAS資料夾為例,如果為3節點叢集,可以利用其中兩個節點向同一資料夾同時寫入,最後將結果相加 以順序寫為例: 進入nas目錄裡(同時寫入的兩個節點of檔名取不同的,否則測試結果偏高),同時從兩個節點寫資料,頻寬為1.7GB/s(兩個節點測試結果之和) ![](https://img2020.cnblogs.com/blog/1480358/202007/1480358-20200702121410898-969236263.png) ![](https://img2020.cnblogs.com/blog/1480358/202007/1480358-20200702121422272-1792890300.png) #### dd命令 ```bash # 測nas資料夾寫速率 dd if=/dev/zero of=dd.client1 bs=1M count=40960 conv=fsync # of:要寫到哪個檔案 # bs:同時設定讀入/輸出的資料塊大小為1M # count:共複製多少個bs 此處:bs=1M count=40960,則一共寫入40G資料 # conv=fsync:在完成dd命令前需要確保檔案的data和metadata都flush到後端儲存,如果不加這個選項,可能還沒寫到儲存上,只存在於客戶端的memory裡就結束了,這樣的結果會偏高。 ``` ## IOPS測試 > 一般使用fio工具來測試IOPS,fio也可以測試頻寬。 > > * 測試IOPS一般使用4K的資料塊 > * 測試頻寬建議使用大於等於1M的資料塊 我們使用叢集提供的塊服務(iscsi),如塊名為rbd0 下圖為同時從兩個節點向/dev/rbd0寫如資料的IOPS測試結果,同理,將兩個IOPS的值相加即粗略得到叢集的IOPS,記得上面說到的用atop檢視三個節點的磁碟狀態,最直觀的就是是否壓紅 ![](https://img2020.cnblogs.com/blog/1480358/202007/1480358-20200702121434089-672973347.png) ![](https://img2020.cnblogs.com/blog/1480358/202007/1480358-20200702121442998-38776294.png) #### fio命令 ```bash # 測rbd IOPS fio --name=randwrite --rw=randwrite --bs=4k --size=100G --runtime=120 --ioengine=libaio --iodepth=128 --numjobs=1 --filename=/dev/rbd0 --direct=1 --norandommap --randrepeat=0 --group_reporting --name=randwrite # Job的名稱,命令列模式下的必填項,如果沒有指定filename,那麼將會根據這個name來生成filename --rw=randwrite # IO pattern的型別,允許的值包括: read/write/randwrite/randread/rw/randrw,具體意義可以直接從字面看出來 --bs=4k # 每次IO的塊大小,預設是4k,如果是頻寬測試,建議至少1m --size=100G # 檔案大小,fio將會傳輸完整個檔案大小,除非設定了執行時間runtime --runtime=120 # 本次fio測試最多會執行這麼長時間,和size共同決定fio執行的時間 --ioengine=libaio # 定義了job如何傳送IO請求,本質上對應了不同的系統IO函式呼叫,常見的有sync/psync/libaio,新版本還有直接針對ceph的rbd --iodepth=128 # IO深度,即同一時刻在途的IO個數,這個引數只在ioengine是非同步的時候有用,如果是sync/psync,那麼不管設多少隻能是1 --numjobs=1 # Job的個數,即多程序執行fio,如果同時給出thread表示多執行緒執行 --filename=/dev/rbd0 # 如果指定filename,那麼所有的job都會讀寫這個file,否則會根據name和numjobs啟動生成file --direct=1 # 如果是1,表示使用non-buffered IO,即讀寫均不經過本地記憶體 --norandommap # fio測試時會維護一張表來記著寫過的地方,預設不會重複的寫一塊地方,新增此選項,會在任何塊隨機寫,這樣更接近業務情景。一般在隨機讀寫的時候加這個引數 --randrepeat=0 # 設定產生的隨機數是不可重複的,目的是增加讀寫的隨機性 --group_reporting # 如果有多個job,不加這個引數就會單獨顯示每個job的輸出,有這個引數就會彙總顯示 ``` ```bash # 測NAS頻寬 fio --name=seqwrite --rw=write --bs=1M --size=5G --runtime=1200 --numjobs=20 --ioengine=libaio --iodepth=16 --direct=1 --group_reporting ``` # 總結 以上簡單的測試只是根據經驗交付完的臨時測試,機房的環境與客戶現場是相當複雜的,通常環境也不是很好,但是搭建好集群后還是稍微堅持下花點時間進行簡單的測試。 即便客戶沒有問到相關問題,但這樣做首先是負責,其次將測試結果記錄在案,方便後面自己與同事的維護