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上。
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
启动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);
});
运行结果时,需要准备一个xml配置文件,以下是一个示范:
<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 "
echo "or:"
echo "nohup ./run.sh &"
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"