Tsung 分散式負載測試容器

從原始碼建置 Tsung 1.6.0 的 CentOS 7 容器,支援 master / slave 分散式壓測,並透過 Marathon API 自動發現 slave 節點。

容器做了什麼

  1. 裝好 Erlang、gnuplot、Perl Template Toolkit(產生報表需要)
  2. 下載並編譯 Tsung 1.6.0
  3. 產生 SSH 金鑰並互信,讓 master 能直接啟動 slave 上的 Erlang 節點
  4. 把 Erlang 節點通訊的 port 範圍從預設的 64000–65500 改成 9001–9050,方便在容器 / Kubernetes 環境開放固定範圍
  5. 設定 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-slavestsung-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 環境變數決定角色:

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 測試工具

本目錄檔案