[心得]Tsung壓測工具科普

tangchen2016發表於2016-11-26

Story

Tsung是erlang開發的一個開源的多協議分散式負載測試工具,它能用來壓力測試HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP 和 Jabber/XMPP的伺服器。它可以分佈在多個客戶機,並能夠模擬成千上萬的虛擬使用者數併發。

基於nodeJS,使用起來非常方便,作圖工具非常棒!

JS + jQuery + NodeJS,前端標配。

在使用node JS時,有一個express的外部元件。相當於nodeJS界的MVC。

作為使用過httperf,jmeter的人來說,覺得這個做圖簡直是so easy。

有過其他效能工具使用經驗的朋友注意:
1. Tsung的每一個虛擬使用者就是一個erlang的輕量程式。
2. 虛擬使用者完成session後就消失。
3. 大量的虛擬使用者(erlang輕量程式)建立在erlangVM上。

Tsung的安裝

CentOS下安裝:

Tsung安裝包、erlang安裝包、Perl ( 生成報告所需模組)、圖形庫gnuplot等
1.erlang
2.perl
3.gnuplot

yum install gd libpng zlib

erlang安裝:
http://www.erlang.org/download/otp_src_Rxxxxx.tar.gz
tar zxvf otp_src_Rxxxxx.tar.gz
cd otp_src_R15B02
./configure
make
make install

gnuplot安裝:
wget http://nchc.dl.sourceforge.net/project/gnuplot/gnuplot/x.x.x/gnuplot-x.x.x.tar.gz
tar -zxvf gnuplot-x.x.x.tar.gz
cd gnuplot-x.x.x
./configure
make
make install

template-toolki安裝:
wget http://www.cpan.org/modules/by-module/Template/Template-Toolkit-2.24.tar.gz
tar zxf Template-Toolkit-2.24.tar.gz
cd Template-Toolkit-2.24
perl Makefile.PL
make
make install

配置

配置Tsung:

~/.tsung/tsung.xml為tsung預設的配置檔案,但我們安裝後會發現這個目錄和檔案並不存在,那就由我們手動來建立這個目錄。
mkdir /home/.tsung

在/usr/share/doc/tsung/examples/中有一些示例檔案,可以參考jabber_register.xml檔案來編寫自己的tsung.xml。
cp /usr/share/doc/tsung/examples/jabber_register.xml ~/.tsung/tsung.xml

Work

啟動Tsung
tsung start/stop/debug/status
tsung -f /home/.tsung/tsung.xml start

進入日誌目錄
cd /root/.tsung/log/20120913-1436

執行指令碼生成報表檔案
/usr/local/lib/tsung/bin/tsung_stats.pl

檢視生成的報表:
通過nodeJS簡單弄一個指令碼,做出一個網頁來展示結果:

#! /usr/bin/env node

console.log('my_tsung_log');

var express = require('express');
var app = express();
var serveIndex = require('serve-index');
var serveStatic = require('serve-static');

var port = 80;

app.use('/log', serveIndex(__dirname + '/log', {'view': 'details', 'icons': true}));
app.use('/log', serveStatic(__dirname + '/log'));

app.get('/', function(req,res) {
        res.send('Hello My Tsung!');
});

app.listen(port, function() {
        console.log('webserver is running on port: '+port);
});

Case Study

執行結果時,需要準備一個xml配置檔案,以下是一個示範:

<?xml version="1.0"?><tsung dumptraffic="false" loglevel="error" version="1.0">
<clients>
      <client host="localhost" use_controller_vm="true" maxusers="600000"/>
  </clients>

  <servers>
     <server host="127.0.0.1" port="8001" type="tcp"/>
  </servers>

  <load duration="100" unit="second">
     <arrivalphase phase="1" duration="10" unit="second">
         <users arrivalrate="2000" unit="second"/>
     </arrivalphase>
  </load>

  <options>
     <option name="file_server" id="login_csv" value="sample_data"/>
  </options>

  <sessions>
    <session bidi="true" probability="100" name="login" type="ts_http">
      <setdynvars sourcetype="file" fileid="'login_csv'" order="iter">
         <var name="data"/>
      </setdynvars>

      <request subst="true">

          <http url="/test" version="1.1" content_type="application/json; charset=utf-8" method="POST" contents="%%_data%%">
          </http>
      </request>

      </session>
  </sessions>
</tsung>

以上測試命令是往127.0.0.1/test介面post資料

最後寫一個bash指令碼將測試命令封裝起來:

#!/usr/bin/env bash

echo "[Usage] ./run.sh <myCfg.xml>"
echo "or:"
echo "nohup ./run.sh <myCfg.xml> &"
config_file=api-refresh-stg2-trial.xml

report_home='./log'
if ! [ -d $report_home ]; then
    mkdir $report_home
    echo "initial log direcotry - done"
fi

if ! [ -e $report_home/readme.tx ]; then
    cp readme.md $report_home/readme.txt
fi
touch "$report_home/timestamp-is-UTC-time"

echo "run load test"
if [ "v$1" != "v" ]; then
        config_file=$1
fi
if ! [ -f $config_file ]; then
        echo "fail to run due to config file does NOT exist! - $config_file"
        exit 1
fi

echo "start load test for config $config_file"
tsung -f $config_file -l ./log  start
echo "load test done!"

echo "generate report"
current_ip=`/sbin/ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'`
last_log=`ls -Art $report_home | grep -vi timestamp | grep -vi index | grep -iv readme| tail -n 1`
cp *.csv $report_home/$last_log/
cd $report_home/$last_log
/usr/local/lib/tsung/bin/tsung_stats.pl
echo "generate tsung reports http://$current_ip/log/$last_log/report.html (use web browser) - done"

相關文章