使用Tsung对Ejabberd进行性能测试
测试环境
操作系统:
Ubuntu Server 14.04
Erlang版本
OTP 17.4
Ejabberd版本
15.02
依赖包
安装生成报告需要的gnuplot
软件包和Template.pm
Perl模块.
1 | apt-get install -y gnuplot apt-get install -y templatetoolkit-perl |
命令行
编写配置文件
生成报告
tsung
会在你的Home目录~/.tsung/log
中生成测试报告, 进入到报告目录执行 /usr/lib/tsung/bin/tsung_stats.pl
可在报告目录下生成HTML格式的统计信息, 可用浏览器打开查看.
例如:
1 | root@scm:cd ~/.tsung/log/20150312-1407 root@scm:/usr/lib/tsung/bin/tsung_stats.pl root@scm:~/.tsung/log/20150312-1746# ll drwxr-xr-x 2 root root 4096 Mar 12 20:28 data/ -rw-r--r-- 1 root root 13720 Mar 12 20:32 gnuplot.log drwxr-xr-x 2 root root 4096 Mar 12 20:28 gnuplot_scripts/ -rw-r--r-- 1 root root 7166 Mar 12 20:32 graph.html drwxr-xr-x 2 root root 4096 Mar 12 20:28 images/ -rw-r--r-- 1 root root 1388 Mar 12 17:46 jabber_register.xml -rw-r--r-- 1 root root 1011724 Mar 12 17:51 match.log -rw-r--r-- 1 root root 8169 Mar 12 20:32 report.html -rw-r--r-- 1 root root 23789099 Mar 12 17:51 tsung_controller@scm.log -rw-r--r-- 1 root root 20601 Mar 12 17:51 tsung.log |
用多个虚拟IP增大并发量
设置临时虚拟IP(重启后消失)
1 | ifconfig eth1:0 192.168.8.35 netmask 255.255.255.0 up ifconfig eth1:1 192.168.8.36 netmask 255.255.255.0 up ifconfig eth1:2 192.168.8.37 netmask 255.255.255.0 up |
http://tsung.erlang-projects.org/user_manual/conf-client-server.html#advanced-setup
1 | <clients> |
多个虚拟IP可以用于模拟多个机器. 这在负载均衡器使用客户端IP把流量分布到集群中的服务器上时特别有用. 在tsung 1.1.1
中IP不再是强制要求了.
在1.4.0
中, 可以使用<ip scan="yes" value="eth0"/>
扫描给定接口的所有IP别名(此例中为eth0
)
Even if an Erlang VM is now able to handle several CPUs (erlang SMP), benchmarks shows that it’s more efficient to use one VM per CPU (with SMP disabled) for tsung clients. Only the controller node is using SMP erlang. Therefore, cpu should be equal to the number of cores of your nodes. If you prefer to use erlang SMP, add the
-s
option when starting tsung (and don’t setcpu
in the config file).
默认, 负载均匀分地布在所有CPU上(默认每客户端一个CPU). 权重(weight)参数(整数)可用于分布客户端机器的负载比例.
例如, 如果一个客户端具有权重为1,其他客户端有权重为2, 那么后者启动的用户数为前者的两倍(比例将为1/3和2/3), 在先前的例子中, 第二个客户端又2个CPU,权重为3, 每CPU的权重为1.5
分布式测试
1 | <client host="t1" cpu="8" maxusers="100000"></client> <client host="t2" cpu="8" maxusers="100000"></client> <client host="t3" cpu="8" maxusers="100000"></client> |
http://my.oschina.net/jielucky/blog/168320
分布式测试的关键
- 相同的Erlang Cookie
- 控制器主机(Master)能够无密码登陆到(Slave)机器上, Master/Slave的机器必须都要安装Tsung
- 配置文件中的
<client host="hostname">
, 其中属性host
必须是名称而不能是IP地址, 因此要么在/etc/hosts
添加相应的解析条目, 要么直接使用DNS
关于后端使用MySQL数据库的情况
- 把
users
表调整为MEMORY引擎 - 修改
s2c_shaper
1 | shaper: normal: 10000 fast: 50000 |
1 | c2s_shaper: admin: none all: fast |
1 | listen: - port: 5222 module: ejabberd_c2s max_stanza_size: 65536 shaper: c2s_shaper access: c2s zlib: true |
参考资料
- http://tsung.erlang-projects.org/user_manual/reports.html
- http://blog.chinaunix.net/uid-13189580-id-3049461.html
- http://my.oschina.net/jielucky/blog/168320
- http://stackoverflow.com/questions/23011544/simulating-online-user-in-ejabberd-with-tsung
- http://www.quora.com/Ejabberd-load-test-with-tsung
- http://vidorsolutions.blogspot.jp/2010/12/load-testing-ejabberd-xmpp-server-with.html
- https://pdincau.wordpress.com/2010/08/01/testing-your-xmpp-external-component-using-tsung-and-ejabberd-part-2/
- http://cryolite.iteye.com/blog/378758