用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