叢集搭建好之後網路,raid卡策略,磁碟都會影響叢集的效能。為了避免因上述問題使得叢集的效能受到影響,我們依次進行測試,最後得到基本的叢集效能。
網路
首先是網路,ceph叢集一大堆讓人摸不著頭腦的問題都出在網路上,所以我們在建立叢集之前就可以測試網路,看其是否有問題,可以通過ping命令來測試網路的連通性,但最好使用iperf,測試下網路傳輸速度。
遇到有不少現場情況,因為光模組導致萬兆網路只有百兆的速度,如果等叢集建好之後效能不如意,花費大量時間排查發現是這個問題就太冤了。
iperf命令
選擇一個節點作為iperf server
iperf -s
選擇其他節點作為iperf client,比如server IP地址為192.168.12.4
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操作與壞盤診斷》
總之,如果有BBU,設定raid cache為No Write Cache if Bad BBU
# 檢視是否存在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(兩個節點測試結果之和)
dd命令
# 測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檢視三個節點的磁碟狀態,最直觀的就是是否壓紅
fio命令
# 測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的輸出,有這個引數就會彙總顯示
# 測NAS頻寬
fio --name=seqwrite --rw=write --bs=1M --size=5G --runtime=1200 --numjobs=20 --ioengine=libaio --iodepth=16 --direct=1 --group_reporting
總結
以上簡單的測試只是根據經驗交付完的臨時測試,機房的環境與客戶現場是相當複雜的,通常環境也不是很好,但是搭建好叢集后還是稍微堅持下花點時間進行簡單的測試。
即便客戶沒有問到相關問題,但這樣做首先是負責,其次將測試結果記錄在案,方便後面自己與同事的維護工作。