爬蟲(03)面向物件寫爬蟲(函式,類)2020-12-14
效能測試
emqtt_bench(opens new window)是基於 Erlang 編寫的,一個簡潔強大的 MQTT 協議效能測試工具,如需大規模場景、深度定製化的測試服務推薦使用 EMQ 合作伙伴XMeter(opens new window)測試服務。
安裝坑:
- erlang 22.3 百度雲盤
- make 百度雲盤
#編譯安裝
emqtt_bench
的執行依賴於 Erlang/OTP 21.2 以上版本執行環境,安裝過程略過,詳情請參考網上各個安裝教程。
Erlang 環境安裝完成後,下載emqtt-bench
最新程式碼,並編譯:
git clone https://github.com/emqx/emqtt-bench
cd emqtt-bench
make
編譯完成後,當前目錄下會生成 一個名為emqtt_bench
的可執行指令碼。執行以下命令,確認其能正常使用:
./emqtt_bench
Usage: emqtt_bench pub | sub | conn [--help]
輸出以上內容,則證明emqtt_bench
已正確安裝到主機。
#使用
emqtt_bench
共三個子命令:
pub
:用於建立大量客戶端執行釋出訊息的操作。sub
:用於建立大量客戶端執行訂閱主題,並接受訊息的操作。conn
:用於建立大量的連線。
#釋出
執行./emqtt_bench pub --help
會得到可用的引數輸出,此處整理:
引數 | 簡寫 | 可選值 | 預設值 | 說明 |
---|---|---|---|---|
--host | -h | - | localhost | 要連線的 MQTT 伺服器地址 |
--port | -p | - | 1883 | MQTT 服務埠 |
--version | -V | 3 4 5 |
5 | 使用的 MQTT 協議版本 |
--count | -c | - | 200 | 客戶端總數 |
--startnumber | -n | - | 0 | 客戶端數量起始值 |
--interval | -i | - | 10 | 每間隔多少時間建立一個客戶端;單位:毫秒 |
--interval_of_msg | -I | - | 1000 | 每間隔多少時間傳送一個訊息 |
--username | -u | - | 無;非必選 | 客戶端使用者名稱 |
--password | -P | - | 無;非必選 | 客戶端密碼 |
--topic | -t | - | 無;必選 | 釋出的主題;支援站位符:%c :表示 ClientId%u :表示 Username%i :表示客戶端的序列數 |
--szie | -s | - | 256 | 訊息 Payload 的大小;單位:位元組 |
--qos | -q | - | 0 | Qos 等級 |
--retain | -r | true false |
false | 訊息是否設定 Retain 標誌 |
--keepalive | -k | - | 300 | 客戶端心跳時間 |
--clean | -C | true false |
true | 是否以清除會話的方式建立連線 |
--ssl | -S | true false |
false | 是否啟用 SSL |
--certfile | - | - | 無 | 客戶端 SSL 證書 |
--keyfile | - | - | 無 | 客戶端 SSL 祕鑰檔案 |
--ws | - | true false |
false | 是否以 Websocket 的方式建立連線 |
--ifaddr | - | - | 無 | 指定客戶端連線使用的本地網絡卡 |
例如,我們啟動 10 個連線,分別每秒向主題t
傳送 100 條 Qos0 訊息,其中每個訊息體的大小為16
位元組大小:
./emqtt_bench pub -t t -h emqx-server -s 16 -q 0 -c 10 -I 10
#訂閱
執行./emqtt_bench sub --help
可得到該子命令的所有的可用引數。它們的解釋已包含在上表中,此處略過。
例如,我們啟動 500 個連線,每個都以 Qos0 訂閱t
主題:
./emqtt_bench sub -t t -h emqx-server -c 500
#連線
執行./emqtt_bench conn --help
可得到該子命令所有可用的引數。它們的解釋已包含在上表中,此處略過。
例如,我們啟動 1000 個連線:
./emqtt_bench conn -h emqx-server -c 1000
#SSL 連線
emqtt_bench
支援建立 SSL 的安全連線,並執行測試。
單向證書,例如:
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 -S
./emqtt_bench pub -c 100 -I 10 -t bench/%i -p 8883 -s 256 -S
雙向證書,例如:
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 --certfile path/to/client-cert.pem --keyfile path/to/client-key.pem
./emqtt_bench pub -c 100 -i 10 -t bench/%i -s 256 -p 8883 --certfile path/to/client-cert.pem --keyfile path/to/client-key.pem
#典型壓測場景
#場景說明
此處我們以 2 類最典型的場景來驗證工具的使用:
- 連線量:使用
emqtt_bench
建立百萬連線到 EMQ X Broker。 - 吞吐量:使用
emqtt_bench
在 EMQ X 中創建出10W/s 的 Qos0
訊息吞吐量。
#機器及部署拓撲圖
共需準備三臺 8C16G 伺服器,一臺為 EMQX Broker,兩臺為 客戶端壓力機。其中:
-
系統:
CentOS Linux release 7.7.1908 (Core)
-
CPU:
Intel Xeon Processor (Skylake)
主頻:2693.670 MHZ
-
服務端:
emqx-centos7-v4.0.2.zip
-
壓力機:
emqtt-bench v0.3.1
- 每臺壓力機分別配置 10 張網絡卡,用於連線測試中建立大量的 MQTT 客戶端連線
拓撲結構如下:
+-----------------------+
| bench1: 192.168.0.100 | ------- +--------------------------+
+-----------------------+ \-----> | EMQ X Broker |
+-----------------------+ /-----> | 192.168.0.99 |
| bench2: 192.168.0.200 | ------- +--------------------------+
+-----------------------+
#調優
客戶端的壓力機和服務端的機器都需要執行系統引數的調優,參見:系統調優
#連線量測試
在執行完系統調優後,首先啟動服務端:
./bin/emqx start
然後在bench1
上的每張網絡卡上啟動 5w 的連線數,共計 50w 的連線:
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.100
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.101
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.102
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.103
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.104
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.105
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.106
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.107
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.108
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.109
在bench2
上也執行同樣的操作。
在所有連線建立完成後,執行./bin/emqx_ctl listeners
,並找到以下的內容, 檢視 EMQ X 中連線數的資訊:
listener on mqtt:tcp:0.0.0.0:1883
acceptors : 8
max_conns : 1024000
current_conn : 1000000
shutdown_count : []
#吞吐測試
同樣的,首先啟動服務端:
./bin/emqx start
在bench1
啟動 500 個訂閱客戶端:
./emqtt_bench sub -t t -h 192.168.0.99 -c 500
然後再bench2
上啟動 20 個釋出端,並且每秒釋出 10 條訊息:
./emqtt_bench pub -t t -h 192.168.0.99 -c 20 -I 100
然後,回到bench1
上的訂閱客戶端,可看到當前接收訊息的速率,類似於:
recv(28006): total=2102563, rate=99725(msg/sec)