Tsung 分散式負載測試容器
從原始碼建置 Tsung 1.6.0 的 CentOS 7 容器,支援 master / slave 分散式壓測,並透過 Marathon API 自動發現 slave 節點。
容器做了什麼
- 裝好 Erlang、gnuplot、Perl Template Toolkit(產生報表需要)
- 下載並編譯 Tsung 1.6.0
- 產生 SSH 金鑰並互信,讓 master 能直接啟動 slave 上的 Erlang 節點
- 把 Erlang 節點通訊的 port 範圍從預設的 64000–65500 改成 9001–9050,方便在容器 / Kubernetes 環境開放固定範圍
- 設定 cron,每分鐘執行一次
tsung-update-hosts更新/etc/hosts
開放的 Port
| Port | 用途 |
|---|---|
| 22 | SSH(master 啟動 slave 用) |
| 8091 | Tsung 即時監控頁面 |
| 4369 | Erlang Port Mapper Daemon (epmd) |
| 9001–9050 | Erlang 節點間通訊 |
節點自動發現
tsung-hosts.sh 會被安裝成 /usr/bin/tsung-update-hosts,向 Marathon API 查詢 tsung-slaves 與 tsung-master 兩個 app 的實際 IP,寫回 /etc/hosts:
curl -s ${MARATHON_URL}/v2/apps/tsung-slaves \
| grep -Po '"host":"\K.*?(?=")' \
| xargs dig +short \
| awk '{ print $1" tsung_slave"NR}' > /etc/tsung/tsung_slaves_hosts.conf
因為容器內不允許直接覆寫 /etc/hosts,腳本改用 cat ... | tee /etc/hosts 繞過限制。
啟動腳本
tsung-run.sh 安裝成 /usr/bin/tsung-run,依 SLAVE 環境變數決定角色:
- 有設
SLAVE:啟動 sshd 與 cron 後就掛著等 master 呼叫 - 沒設
SLAVE:以 master 身分執行測試,結束後自動跑tsung_stats.pl產生報表
cmd='tsung -l /usr/local/tsung/ '$@
${cmd}
cd /usr/local/tsung/${current_date}/ && /usr/lib64/tsung/bin/tsung_stats.pl
使用方式
# 建置映像
docker build -t tsung:1.6.0 .
# 單機執行(設定檔透過 volume 掛進來)
docker run --rm \
-v $(pwd)/mqtt.xml:/etc/tsung/mqtt.xml \
-v $(pwd)/results:/usr/local/tsung \
-e MARATHON_URL=http://marathon:8080 \
tsung:1.6.0 tsung-run -f /etc/tsung/mqtt.xml start
# 以 slave 身分啟動
docker run -d -e SLAVE=1 -e MARATHON_URL=http://marathon:8080 tsung:1.6.0 tsung-run
測試結束後,results/<timestamp>/ 裡會有 HTML 報表與 gnuplot 圖表。
MQTT 壓測範例
docker-entrypoint.sh 示範如何把 Tsung 內建的 examples/mqtt.xml 改成指向公開測試 broker:
sed -i 's/127.0.0.1/test.mosquitto.org/g' /tsung-1.6.0/examples/mqtt.xml
sed -i 's/5672/1883/g' /tsung-1.6.0/examples/mqtt.xml
相關資源
← 回到 Testing 測試工具