mqtt服务器性能H3,运用 MQTT-JMeter 插件测试 MQTT 服务器性能
MQTT 簡(jiǎn)介
MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸)是 IBM 開(kāi)發(fā)的一個(gè)即時(shí)通訊協(xié)議,它比較適合于在低帶寬、不可靠的網(wǎng)絡(luò)的進(jìn)行遠(yuǎn)程傳感器和控制設(shè)備通訊等,正在日益成為物聯(lián)網(wǎng)通信協(xié)議的重要組成部分。MQTT 是目前最流行的物聯(lián)網(wǎng)協(xié)議之一,主要用于移動(dòng) Push,移動(dòng) IM,物聯(lián)網(wǎng) M2M,物聯(lián)網(wǎng)采集等,這些應(yīng)用場(chǎng)景的特點(diǎn)是客戶端的連接設(shè)備數(shù)比較多,那么如何在系統(tǒng)上線之前驗(yàn)證系統(tǒng)能否承受預(yù)先設(shè)計(jì)的壓力呢?
XMeter 因此專(zhuān)門(mén)開(kāi)發(fā)(并維護(hù))了 MQTT JMeter 插件,用戶可以很方便地測(cè)試 MQTT 服務(wù)器的性能:添加 MQTT 連接、發(fā)布、訂閱取樣器,構(gòu)造組合的應(yīng)用場(chǎng)景,例如背景連接、多發(fā)少收、少發(fā)多收,計(jì)算消息轉(zhuǎn)發(fā)時(shí)延等。利用該插件,我們?yōu)镋MQ成功實(shí)施了包括百萬(wàn)級(jí)并發(fā)連接在內(nèi)的一系列測(cè)試場(chǎng)景,這里有詳細(xì)的測(cè)試報(bào)告。
今天我們來(lái)詳細(xì)介紹一下怎么使用這個(gè)插件。
安裝
從github下載您需要的 release 版本, 解壓 mqtt-xmeter-jar-with-dependencies.jar.zip, 將生成的 jar 文件放到 JMeter 安裝主目錄的 lib/ext 下,重啟 JMeter,就可以看到插件成功加載。
插件各屬性介紹
1.連接操作取樣器
Server name or IP: 指向被測(cè) MQTT 服務(wù)器地址。【注】為靈活起見(jiàn),屬性值都可以引用 JMeter 的系統(tǒng)或自定義變量。
Port number: 通常 TCP 連接的端口是 1883, SSL 連接則是 8883。請(qǐng)參照服務(wù)器的具體配置。
Timeout(s): 連接超時(shí)設(shè)置,以秒為單位。
Protocols: 客戶端與服務(wù)器通過(guò) SSL 加密通道連接時(shí),可以選擇單向或者雙向認(rèn)證 (Dual)。雙向認(rèn)證時(shí),您還需要指定相應(yīng)的信任秘鑰庫(kù) (Trust Key Store), 客戶端證書(shū),以及對(duì)應(yīng)的文件保護(hù)密碼 (Secret)。
這些文件可以通過(guò)服務(wù)器的證書(shū)配置轉(zhuǎn)化得到。例如,對(duì)于EMQ的安裝部署,/etc/cert 下就存放了自簽證的 CA,服務(wù)器及客戶端證書(shū),參考下面的命令就可以生成插件所需的.jks, .p12 文件,secret 自行指定即可。
exportPATH=$PATH:/bin
keytool -import -alias cacert -keystore emqtt.jks -file cacert.pem -storepass -trustcacerts -noprompt
keytool -import -alias client -keystore emqtt.jks -file client-cert.pem -storepass
keytool -import -alias server -keystore emqtt.jks -file cert.pem -storepass
openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.p12 -password pass:
User authentication: 如果服務(wù)器配置了用戶認(rèn)證,您需要提供相應(yīng)的用戶名和口令。
ClientId prefix: 標(biāo)識(shí)客戶端的固定前綴,每個(gè)連接 (虛擬用戶) 再添加一個(gè) uuid 串,整個(gè)作為客戶標(biāo)識(shí)。
Keep alive(s): 心跳信號(hào)發(fā)送間隔。例如,300 表示客戶端每隔 300 秒向服務(wù)器發(fā)出 ping 請(qǐng)求,以保持連接活躍。
Connection keep time(s): 連接建立后,保持該連接的時(shí)長(zhǎng)。例如,1800 表示 1800 秒之后連接將被關(guān)閉,即使一直發(fā)送心跳信號(hào)。
Connect attempt max: 第一次連接過(guò)程中,嘗試重連的最大次數(shù)。超過(guò)該次數(shù)則認(rèn)為連接失敗。
Reconnect attempt max: 后繼連接過(guò)程中,嘗試重連的最大次數(shù)。超過(guò)該次數(shù)則認(rèn)為連接失敗。
2.發(fā)布操作取樣器
發(fā)布 (Pub) 取樣器的連接相關(guān)屬性與連接取樣器完全相同,下面只介紹 Pub 特有的屬性。
QoS Level: 服務(wù)質(zhì)量,取值為 0,1,2,分別代表 MQTT 協(xié)議規(guī)范里的至多一次(AT_MOST_ONCE),至少一次(AT_LEAST_ONCE),精確一次(EXACTLY_ONCE)
Topic name: 發(fā)布消息所屬的話題(訂閱方可以根據(jù)話題不同選擇訂閱)
Add timestamp in payload: 如果勾選,發(fā)布的消息體開(kāi)頭會(huì)附帶當(dāng)前時(shí)間戳,利用它可以在消息接收端計(jì)算消息達(dá)到的延時(shí)。不勾選則只發(fā)送實(shí)際的消息體。
Message type: 目前支持三種消息類(lèi)型
String: 普通字符串(如上面截圖所示)
Hex String: 以 16 進(jìn)制數(shù)值表示的串,比如字符串 Hello, 可以表示為 48656C6C6F (其中,48 在 ascii 表中對(duì)應(yīng)字母 H,依次類(lèi)推)。通常 16 進(jìn)制串用來(lái)構(gòu)造非文本的消息體,例如描述某些私有的協(xié)議交互和控制信息等等。
Random string with fixed length: 按指定長(zhǎng)度生成隨機(jī)的串作為消息體。
3. 訂閱操作取樣器
QoS Level: 服務(wù)質(zhì)量,含義與發(fā)布操作取樣器相同。
Topic name: 訂閱消息所屬的話題。
Payload includes timestamp: 如果勾選,會(huì)從消息體開(kāi)頭處解析發(fā)送時(shí)間戳,用于計(jì)算消息的接收延時(shí)。
Debug response: 如果勾選,消息內(nèi)容會(huì)打印在 JMeter 的響應(yīng)結(jié)果中,用于調(diào)試目的。正式運(yùn)行測(cè)試建議不勾選。
混合負(fù)載的測(cè)試場(chǎng)景
運(yùn)用以上 3 種 MQTT 取樣器,結(jié)合 JMeter 靈活的測(cè)試控制,您可以制定各種類(lèi)型的測(cè)試場(chǎng)景。下面我們舉一個(gè)例子,構(gòu)造一個(gè)混合負(fù)載的場(chǎng)景。
? 連接者:虛擬用戶數(shù)=10, 發(fā)起 10 個(gè)到服務(wù)器的背景連接,每 2 秒鐘發(fā)一次心跳請(qǐng)求,15 秒后斷連。
? 發(fā)布者:虛擬用戶數(shù)=5,每隔一秒發(fā)送一條 32 字節(jié)的隨機(jī)串,帶時(shí)間戳,循環(huán) 10 次結(jié)束。
? 訂閱者:虛擬用戶數(shù)=2,接收相應(yīng)話題上的消息,每隔一秒輸出采樣間隔里接收到的消息統(tǒng)計(jì),循環(huán) 10 次結(jié)束。
在 JMeter 中運(yùn)行該場(chǎng)景,15 秒鐘左右運(yùn)行結(jié)束。可以在測(cè)試結(jié)果樹(shù)中看到每個(gè)操作的詳細(xì)信息。表格視圖的"Sample Time"列出了操作花費(fèi)的時(shí)間 (毫秒)。由于這次測(cè)試在本地,并發(fā)用戶數(shù)很少,所以連接、消息發(fā)送、接收時(shí)延都很短。您可以指向?qū)嶋H的 MQTT 服務(wù)器,模擬更大的并發(fā)用戶數(shù)。
在被測(cè)的EMQ服務(wù)器自己的度量?jī)x表盤(pán),我們可以看到連接、消息發(fā)送,接收等統(tǒng)計(jì)信息。
【注】服務(wù)器的"received", "sent"分別對(duì)應(yīng) JMeter 測(cè)試中的 “發(fā)送者” 和 “訂閱者”。
利用 XMeter 實(shí)施云上的高負(fù)載壓力測(cè)試
JMeter 支持的負(fù)載有限,而且壓力機(jī)需要人工管理,為方便用戶實(shí)施大規(guī)模的并發(fā)測(cè)試,XMeter 性能測(cè)試云服務(wù)將 JMeter 支持的運(yùn)行場(chǎng)景遷移到云端,按需 “彈性” 地分配測(cè)試資源,發(fā)起到目標(biāo)機(jī)器的壓力測(cè)試,衡量被測(cè)系統(tǒng)的性能表現(xiàn)。
我們只需上傳調(diào)試好的 JMeter 腳本,在 XMeter 指定并發(fā)數(shù)和運(yùn)行時(shí)間,就可以在網(wǎng)頁(yè)上查看各項(xiàng)性能指標(biāo)。
利用 MQTT-JMeter 插件,我們?yōu)镋MQ成功實(shí)施了包括百萬(wàn)級(jí)并發(fā)連接在內(nèi)的一系列測(cè)試場(chǎng)景,這里有詳細(xì)的測(cè)試報(bào)告。
希望這個(gè)開(kāi)源的插件和 XMeter 在線服務(wù)也能為您測(cè)試 MQTT 帶來(lái)一些便利。如果有任何問(wèn)題,請(qǐng)聯(lián)系我們。
新版插件新增功能介紹
1. ClientID
標(biāo)識(shí)客戶端的 ClientId 現(xiàn)在可以進(jìn)行精確控制,而不是舊版本里只允許輸入前綴,剩下的由系統(tǒng)自動(dòng)生成。該功能是考慮到一些 Azure 的物聯(lián)網(wǎng)平臺(tái)的用戶需要輸入精確的 ClientId。如下圖所示:如果用戶沒(méi)有選中 “Add random client id suffix”,那么 ClientId 輸入框中的值就會(huì)被作為該虛擬用戶的 ClientId 值。
2. 同虛擬用戶下共享MQTT連接
之前的版本中,每創(chuàng)建一個(gè) Pub/Sub 的 Sampler 都會(huì)生成一個(gè) MQTT 連接,這對(duì)于想模擬一些物聯(lián)網(wǎng)的場(chǎng)景的時(shí)候并不適用。比如某物聯(lián)網(wǎng)設(shè)備除了向服務(wù)器發(fā)送傳感器采集的數(shù)據(jù)之外,還需要接受從服務(wù)器端發(fā)送過(guò)來(lái)的控制消息,而這兩部分發(fā)送和接收消息會(huì)使用同一個(gè)連接。現(xiàn)在 Pub/Sub 的 Sampler 提供了一個(gè)選項(xiàng)允許用戶共享連接的選項(xiàng)。如下圖所示增加的 “Share conn in thread”。在同一個(gè)線程組中,如果有多個(gè) Sampler 勾選了該選項(xiàng),那么第一個(gè)被初始化的 Sampler 中的連接選項(xiàng)會(huì)被作為共享的連接的配置,剩下的 Sampler 中的連接配置會(huì)被忽略,因?yàn)槭褂玫氖堑谝粋€(gè)共享連接的配置。
下面是幾個(gè)例子:
ThreadGroupSample1
PubSampler1 (shared connection), 該連接的配置作為共享連接的設(shè)置
SubSampler1 (shared connection), 使用在 PubSampler1 創(chuàng)建的連接,該 Sampler 中的配置將被忽略
ThreadGroupSample2
PubSampler1 (shared connection), 該連接的配置作為共享連接的設(shè)置
SubSampler1 (not shared connection), 會(huì)創(chuàng)建一個(gè)新的連接,因?yàn)槭褂玫氖欠枪蚕淼倪B接
ThreadGroupSample3
PubSampler1 (not shared connection), 會(huì)創(chuàng)建一個(gè)新的連接,因?yàn)槭褂玫氖欠枪蚕淼倪B接
SubSampler1 (shared connection), 該連接的配置作為共享連接的設(shè)置
SubSampler2 (shared connection), 使用在 SubSampler1 創(chuàng)建的連接,該 Sampler 中的配置將被忽略
3. Sub Sampler 支持訂閱多個(gè) Topic
現(xiàn)在 Sub Sampler 支持訂閱多個(gè)主題,主題之間用逗號(hào)分隔
4. Sub可以控制接收消息并且生成一條測(cè)試記錄的方式
如下圖所示,“Sample on” 下拉列表框中允許用戶指定產(chǎn)生一條測(cè)試記錄的方式,缺省為 “elapsed with specified time(ms)”,意思為在指定的時(shí)間區(qū)間(單位為毫秒)生成一條測(cè)試記錄,不管在該測(cè)試區(qū)間段里有沒(méi)有收到消息;另外的一種方式是 “number of received messages”,該選項(xiàng)意味著當(dāng)前虛擬用戶只有在收到了指定數(shù)目的消息的時(shí)候才會(huì)生成一條測(cè)試記錄。
5.Pub中topic的使用變成了針對(duì)單個(gè)虛擬用戶
新版本的 Pub 實(shí)現(xiàn)中,用戶指定了 topic 后,只會(huì)使用第一次建立連接的時(shí)候傳入的 topic 的名字,而不管傳入的是否是一個(gè)變量值。
總結(jié)
以上是生活随笔為你收集整理的mqtt服务器性能H3,运用 MQTT-JMeter 插件测试 MQTT 服务器性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深圳农村商业银行转账显示服务器无响应,深
- 下一篇: sftp服务器同步文件到本地,服务器之间