使用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
2
3
4
5
6
7
8
9
10
<clients>
<client host="louxor" weight="1" maxusers="800">
<ip value="10.9.195.12"></ip>
<ip value="10.9.195.13"></ip>
</client>
<client host="memphis" weight="3" maxusers="600" cpu="2"/>
</clients>
<servers>
<server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>

多个虚拟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 set cpu 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

参考资料

  1. http://tsung.erlang-projects.org/user_manual/reports.html
  2. http://blog.chinaunix.net/uid-13189580-id-3049461.html
  3. http://my.oschina.net/jielucky/blog/168320
  4. http://stackoverflow.com/questions/23011544/simulating-online-user-in-ejabberd-with-tsung
  5. http://www.quora.com/Ejabberd-load-test-with-tsung
  6. http://vidorsolutions.blogspot.jp/2010/12/load-testing-ejabberd-xmpp-server-with.html
  7. https://pdincau.wordpress.com/2010/08/01/testing-your-xmpp-external-component-using-tsung-and-ejabberd-part-2/
  8. http://cryolite.iteye.com/blog/378758