[心得]Tsung压测工具科普

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配置文件,以下是一个示范:

<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"

你可能感兴趣的:(性能测试)