对于海外服务器集群压力测试,基于erlang开发的Tsung是一款现成的工具,也满足了测试所需的基本要求。
1)Tsung的安装
首先必须安装erlang 版本当时用的是8.3 因为当时服务器已经安装了erlang 所以这里就不详细叙述了 只是erlang安装过程需要依赖很多组件 这里需要补充完整
- wget http://erlang.org/download/otp_src_19.1.tar.gz
- tar xzf otp_src_19.1.tar.gz
- cd到目录下 ./configure --prefix=/home/erlang
- yum install gcc
- yum install ncurses-devel
- yum install openssl-devel
- yum install java-devel
- yum install unixODBC-devel
- yum install gcc-c++
- ./configure --with-ssl=/home/ssl/ --prefix=/home/erl
- make
- make install
- ln -s /home/erlang/bin/erl /usr/local/bin/erl
除了erlang之外 还需要一些其他组件,如果只是单纯的测试可以不安装
- perl5:生成报表的脚本支持环境 yum install perl -y
- gnuplot:报表统计图片生成工具 yum install perl5 gnuplot
- libtemplate-perl: 生成报表所需的画图模板库
去官网下载tsung-1.7.0.tar.gz(亲测可用) 也可以直接wget http://tsung.erlang-projects.org/dist/tsung-1.7.0.tar.gz
- chmod 755 tsung-1.7.0.tar.gz
- tar –xvzf tsung-1.7.0.tar.gz
- cd tsung-1.7.0
- ./configure --prefix=/usr/local/tsung
- 注意 这里会报错 原因是找不到可执行的erl
- 需要配置一下erl的安装路径export PATH=$PATH:/otp/erlang/bin
- make
- make install
- ln -s /usr/local/tsung/bin/tsung /usr/bin/
[root@izwz90zkx5ohgkq04rpm4az tsung]# find / -name erl /otp/erlang/bin/erl
安装完毕之后 tsung -version查看版本是否安装成功 sh tsung启动Tsung
将配置好的tsung.xml放到指定目录 启动 tsung -f tsung.xml start
2)xml配置
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/tsung/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" dumptraffic="false" version="1.0">
<!-- weight 集群时有用-->
<!-- maxusers 产生测试用户数-->
<!-- Client side setup -->
<!-- 集群Client设置 -->
<!-- host必须是主机名,不能是IP地址 -->
<!-- weight: 节点上面用户的比例,一般设置为1即可 -->
<!-- maxusers: 一般设置为800,3000即可,根据机器配置来设置大小 超过这个数目
会自动开启更多的节点-->
<!-- cpu: 根据机器硬件配置来设置,如果是4核CPU,最佳设置为3,以此类推 -->
<clients>
<!-- <client host="localhost" use_controller_vm="true" maxusers="1000" /> -->
<client host="testuser1" weight="1" maxusers="800" use_controller_vm="true" cpu="3" />
<client host="testuser2" weight="1" maxusers="800" use_controller_vm="true" cpu="3" />
<client host="testuser3" weight="1" maxusers="800" use_controller_vm="true" cpu="3" />
</clients>
<servers>
<server host="这里是服务器域名" port="900" type="tcp" />
</servers>
<!-- load段可配置访问的负载,访问可以配成多个阶段,由phase值指定。duration是测试持续时间,unit是单位
users段的maxnumber限制了生成的最大用户数,interarrival=”0.02”表示0.02秒产生一个新用户,用户按照session的配置顺
序执行session中的request
-->
<!-- 负载场景设置 -->
<!-- phase:阶段,填数字即可,系统会按顺序执行,可以设置多个阶段组合场景 -->
<!-- duration:持续时段,填数字即可,单位是unit="minute"设置,是分钟
也可设置小时,天,详细情况参考API -->
<!-- arrivalrate:虚拟用户数,填写数字即可,一般最大800,如过机器配置好,可自己调试最佳参数
有效单位unit="second" 是秒,每秒虚拟300个虚拟用户,实际执行情况可能超过,也可能达不到,需要根据调试得到最佳参数 -->
<!-- interarrival: 时间间隔默认是2秒产生一个用户 这个选项可以和arrivalrate互相调换 -->
<!-- maxnumber: 这个是设置最大用户数,所产生的总用户数不会超过这个 -->
<load>
<arrivalphase phase="1" duration="60" unit="second">
<users maxnumber="1200" arrivalrate="20" unit="second" />
</arrivalphase>
</load>
<sessions>
<!-- 测试接口配置信息 -->
<session name="websocket" probability="0" type="ts_websocket">
<!-- 随机生成15位数 -->
<!-- 调用这个随机生成数 %%_iemi_%% ,前提 <request> 必须配 subst="true"-->
<setdynvars sourcetype="random_string" length="15">
<var name="imei" />
</setdynvars>
<request subst="true">
<websocket type="connect" path="/websocket"></websocket>
</request>
<request>
<websocket type="message" ack="no_ack" frame="text">{type:1,userId:"13588701163"}</websocket>
</request>
<request>
<websocket type="close"></websocket>
</request>
<transaction name='getlist'>
<request subst="true">
<http url="/comment/addComment" method="POST" contents = "item_type=image&item_id=%%_itemid%%&content=%%_content%%"></http>
</request>
</transaction>
</session>
<!-- 可配置多个子session,进而可测试多个api,可以设置请求概率,在probability里被定义,要求每个session的probability之和是100。类型是http。
sessions里可用for来设定请求次数,如下
<for from="1" to="@loop" incr="1" var="counter">
在里面可以设置请求的具体信息。在请求参数里可以带上随机数。随机数和随机字符串的定义如下:
<setdynvars sourcetype="random_number" start="20" end="5000000">
<var name="xxx" />
</setdynvars>
<setdynvars sourcetype="random_string" length="10">
<var name="xxx" />
</setdynvars>
以%%_xxx%%的形式来调用,这里必须注意的是,要使用随机数,request必须加上subst=”true”参数,不然随机数无法被引用成功。随机数也可从文件读取,如csv。
http内部可定义header参数:
<http_header name="Authorization" value="111"/>
<http_header name="Cookie" value="authToken=%%_auth_token%%; Path=/"/>
content-Type:POST请求参数的格式,如果是json格式可以这样写
<http_header name="Content-Type" value="application/json"/>
thinktime可用于定义两个请求的间隔时间
<thinktime value="1"/>
另外可定义不同的transaction ,这样子结果里就会显示不同transaction的具体信息。 -->
<session name="http" probability="100" type="ts_http">
<setdynvars sourcetype="random_number" start="60000" end="90000">
<var name="itemid" />
</setdynvars>
<setdynvars sourcetype="random_number" start="1" end="4">
<var name="style" />
</setdynvars>
<setdynvars sourcetype="random_number" start="1" end="2">
<var name="sex" />
</setdynvars>
<setdynvars sourcetype="random_string" length="10">
<var name="imei" />
</setdynvars>
<setdynvars sourcetype="random_number" start="100000" end="900000">
<var name="uidx" />
</setdynvars>
<transaction name='test_create'>
<request subst="true">
<http url="/game/create_role" method="POST" contents = "phone=0;style=%%_style%%;sex=%%_sex%%;random_num=%%_itemid%%;server=0;time=1558525433;name=%%_imei%%;uidx=%%_uidx%%"></http>
</request>
</transaction>
</session>
</sessions>
</tsung>
生成的文件 可以在指定目录查看