1. 程式人生 > 其它 >爬蟲(03)面向物件寫爬蟲(函式,類)2020-12-14

爬蟲(03)面向物件寫爬蟲(函式,類)2020-12-14

效能測試

emqtt_bench(opens new window)是基於 Erlang 編寫的,一個簡潔強大的 MQTT 協議效能測試工具,如需大規模場景、深度定製化的測試服務推薦使用 EMQ 合作伙伴XMeter(opens new window)測試服務。

安裝坑:

  1. erlang 22.3 百度雲盤
  2. 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共三個子命令:

  1. pub:用於建立大量客戶端執行釋出訊息的操作。
  2. sub:用於建立大量客戶端執行訂閱主題,並接受訊息的操作。
  3. 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 類最典型的場景來驗證工具的使用:

  1. 連線量:使用emqtt_bench建立百萬連線到 EMQ X Broker。
  2. 吞吐量:使用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)