用JMeter測試emqx伺服器性能
- 2019 年 12 月 12 日
- 筆記
來源:http://www.51testing.com
Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟體做壓力測試,它最初被設計用於Web應用測試,但後來擴展到其他測試領域。
JMeter是一個圖形化軟體,用戶設置好test plan之後執行,就可以測試伺服器了。
由於我的阿里雲不能圖形化,所以我在Linux以及本地windows上分別裝了JMeter:先用自己電腦設置好test plan,再上傳到阿里雲伺服器上運行。
JMeter安裝步驟
參考:JMeter測試EMQ集群:http://www.51testing.com/?action-viewnews-itemid-4461956
(JMeter是java寫的,所以安裝JMeter前要確保JDK是最新的,我的JDK是1.8)
去官網下載二進位文件壓縮包(不要下源程式碼):http://jmeter.apache.org/download_jmeter.cgi
註:關於binary和source,tgz和zip的區別:http://www.51testing.com/?action-viewnews-itemid-4461955
不過其實windows下也能解壓tgz,Linux也能解壓zip。linux和windows用相同壓縮包的就行。
windows下JMeter安裝
建議對windows熟的童鞋(應該大部分人都是操作windows比較熟練吧)先裝windows的。裝好之後,Linux那邊直接重複相同步驟就可以。
1. 解壓apache-jmeter-5.1.1.tgz
2. 下載JMeter中支援MQTT的插件
jmeter原生中沒有測試MQTT,因此必須加相關的插件jar包。
在 GitHub – emqx/mqtt-jmeter: MQTT JMeter Plugin:https://github.com/emqx/mqtt-jmeter,將Download/v1.0.1目錄下的mqtt-xmeter-1.0.1-jar-with-dependencies.jar下載下來,然後放在你的jmeter文件夾lib/ext下。
3. 試試bin/jmeter.bat能不能正常打開~
JMeter.bat的位置如圖

能正常打開、顯示圖形介面的話就OK了。
註:我有看到一些兩三年前的部落格寫到,需要把JMeter加到系統環境變數,但是我並沒有加也可以正常使用,現在應該是不用更改環境變數了。
linux下JMeter安裝
1. 解壓apache-jmeter-5.1.1.tgz
tgz格式的壓縮包不能用unzip哦。用 tar zxvf apache-jmeter-5.1.1.tgz -C ./ 解壓到當前目錄
2. 同windows下安裝的第二步
圖方便的話,直接把本地windows的lib/ext文件夾里mqtt-xmeter-1.0.1-jar-with-dependencies.jar上傳到Linux端的lib/ext即可。
3. 配置環境變數
vim etc/profile
增加如下內容:
export PATH=/root/apache-jmeter-5.1.1/bin:$PATH
就像下面這張圖這樣:

改的時候要仔細,PATH寫錯了補救可是很麻煩的哦
改完了別忘了執行source /etc/profile
JMeter的安裝到這裡就完成了。(真是比emqtt_benchmark簡單多了)
添加test plan
打開windows的JMeter.bat,設置一個test plan
1. 添加執行緒組

2. 添加MQTT connect 測試

3. 相關設置
number of threads 執行緒數:我設置了50000。因為看到有部落格說「1G記憶體對應6W設備連接」。
然兒我最後執行緒數只達到了1W多(阿里雲輕量伺服器,1核CPU,2GB記憶體)


1. Server name or IP: 指向被測MQTT伺服器地址。我也不太懂為什麼127.0.0.1都可以
2. Port number: TCP連接的埠是1883;SSL連接:8883。
3. MQTT vesion: EMQ X官網說支援V3.1/V3.1.1。所以這裡選3.1或者3.1.1都可以。
後面那個user name 和 password寫登陸emqx dashboard的那個
4.ClientId prefix: 標識客戶端的固定前綴,每個連接(虛擬用戶)再添加一個uuid串,整個作為客戶標識。
Keep alive(s): 心跳訊號發送間隔。例如,300表示客戶端每隔300秒向伺服器發出ping請求,以保持連接活躍。
Connection keep time(s): 連接建立後,保持該連接的時長。例如,1800表示1800秒之後連接將被關閉,即使一直發送心跳訊號。
Connect attempt max: 第一次連接過程中,嘗試重連的最大次數。超過該次數則認為連接失敗。
Reconnect attempt max: 後繼連接過程中,嘗試重連的最大次數。超過該次數則認為連接失敗。
設置完,保存為jmx格式即可。
運行test plan
jmeter -n -t /root/apache-jmeter-5.1.1/bin/test.jmx
我最開始報了這樣的錯:
Unable to get local host IP address.; nested exception is:
java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
解決方法:
vim /etc/hosts
#添加你的IP地址 以及剛剛報錯資訊里提到的這個用戶
例如 123.456.789 iZwz95j86y235aroi85ht0Z
然後就可以運行了。
運行的時候可以打開dashboard查看,可以看到連接的client數量在噌噌噌的往上漲。
如下圖所示,可以看到連接的峰值為11581,記憶體為340M。這個記憶體好像是emq的節點根據當前的執行緒數分配的,執行緒增多,分配的記憶體(圖中的total)就會相應地增加(不過,免費版emqx的記憶體是有上限的)
但是我不太懂那個(used/available),為啥是19111。

可以看到這個clientid和我們在test plan中設置的一樣。這些client都是測試產生的。

星雲測試
http://www.teststars.cc
奇林軟體
http://www.kylinpet.com
聯合通測
http://www.quicktesting.net