使用TSung对Jabber服务器openfire进行压力测试

时间:2022-11-21 04:53:03

Jabber的优点

开放— Jabber协定是*、开放、公开的,并且易于了解。而且在客户端服务器元件源码库等方面,都已经各自有多种实作。

标准— 因特网工程工作小组(IETF)已经将Jabber的核心XML串流协定以XMPP之名,正式列为认可的即时通讯及Presence技术。而XMPP的技术规格已被出版为RFC 3920RFC 3921

证实可用— 第一个Jabber技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为Jabber技术而努力。今日的因特网上有数以万计的Jabber服务器运作著,并有数以百万计的人们使用Jabber即时传讯软件。

分布式— Jabber网络的架构和电子邮件十分相像;因此任何人都可以运行自己的Jabber服务器,使个人及组织能够掌控他们的即时传讯体验。

安全— 任何Jabber服务器可以独立于公众Jabber网络(例如在企业内部网络中),而使用SASLTLS等技术的可靠安全性,已内建于核心XMPP技术规格中。

可扩展— XML命名空间的威力可使任何人在核心协定的基础上建造客制化的功能;为了维持通透性,常见的扩充套件由Jabber软件基金会管理。

弹性佳— Jabber除了可用在即时通讯的应用程式,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。

多样性— 用Jabber协定来建造及布署即时应用程式及服务的公司及开放源码计划分布在各种领域;用Jabber技术开发软件,资源及支援的来源是多样的,使得使你不会陷于被“绑架”的困境



这周准备对openfire3.6.4进行压力测试,从一些资料显示TSung对jabber协议有较好的支持,因此今天下载安装并初步对压力进行测试,主要的步聚如下:

1、从官方网站下载安装包(我的电脑是ubuntu ,所以下载的是Deb包)。 目前官方最新版本为1.3.3, 下载地址为:

     http://tsung.erlang-projects.org/dist/ubuntu/tsung_1.3.3-1_all.deb

     下载后使用 sudo dpkg -i tsung_1.3.3-1_all.deb 进行安装,报错, 找不到依赖包erlang-nox,

     继续使用 :sudo apt-get install erlang-nox

                     sudo apt-get -f install

     安装所有需要依赖的包。

     安装成功后运行 tsung -v 显示版本号:Tsung version 1.3.3  表明安装成功。

2、建立压力测试配置文件对服务器进行配置。

     默认的配置文件存在于 ~/.tsung/tsung.xml 中。

     从示例配置中复制需要进行测试的配置 /usr/share/doc/tsung/examples/jabber_register.xml

      示例配置代码如下:

[xhtml] view plaincopy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">  
  3. <tsung loglevel="notice" dumptraffic="false" version="1.0">  
  4.     
  5.   <clients>  
  6.     <client host="localhost" use_controller_vm="true">  
  7.     </client>  
  8.   </clients>  
  9. <servers>  
  10.    <server host='127.0.0.1' port='5222' type='tcp'/>  
  11. </servers>  
  12.     
  13. <!-- register 200000 users in less than 15 minutes  -->  
  14. <load>  
  15.   <arrivalphase phase="1" duration="15" unit="minute">  
  16.     <users maxnumber="200000" interarrival="0.0025" unit="second"></users>  
  17.   </arrivalphase>  
  18.   </load>  
  19. <options>  
  20.   <option type="ts_jabber" name="global_number" value="5"></option>  
  21.   <option type="ts_jabber" name="userid_max" value="200000"></option>  
  22.   <option type="ts_jabber" name="domain" value="erlang-projects.org"></option>  
  23.   <option type="ts_jabber" name="username" value="tsung"></option>  
  24.   <option type="ts_jabber" name="passwd" value="tsung"></option>  
  25. </options>  
  26. <sessions>  
  27.   <session probability="100" name="jabber-example" type="ts_jabber">  
  28.       
  29.     <request>  
  30.       <jabber type="connect" ack="local"></jabber>  
  31.     </request>  
  32.       
  33.     <request>   
  34.       <match do="abort" when="match">error</match>  
  35.       <jabber type="register" ack="local" id="new"></jabber>  
  36.     </request>  
  37.       
  38.     <request>   
  39.       <jabber type="close" ack="local"></jabber>  
  40.     </request>  
  41.       
  42.   </session>  
  43. </sessions>  
  44. </tsung>  
 

对要进行压力测试的openfire服务器信息(IP和域名)进行修改:

[xhtml] view plaincopy
  1. <servers>  
  2.    <server host='127.0.0.1' port='5222' type='tcp'/>  
  3. </servers>  
  4.   <option type="ts_jabber" name="domain" value="erlang-projects.org"></option>  

由于第一次配置有问题就运行了 tsung start  &, 接下来运行就一直报错:

[php] view plaincopy
  1. tsung start &   
  2. [2] 18021  
  3. web@spider:~/.tsung$ Starting Tsung  
  4. {error_logger,{{2010,12,13},{14,56,52}},"Protocol: ~p: register error: ~p~n",["inet_tcp",{{badmatch,{error,duplicate_name}},[{inet_tcp_dist,listen,1},{net_kernel,start_protos,4},{net_kernel,start_protos,3},{net_kernel,init_node,2},{net_kernel,init,1},{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}]}  
  5. {error_logger,{{2010,12,13},{14,56,52}},crash_report,[[{initial_call,{net_kernel,init,['Argument__1']}},{pid,<0.22.0>},{registered_name,[]},{error_info,{exit,{error,badarg},[{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[net_sup,kernel_sup,<0.10.0>]},{messages,[]},{links,[#Port<0.162>,<0.19.0>]},{dictionary,[{longnames,false}]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,24},{reductions,498}],[]]}  
  6. {error_logger,{{2010,12,13},{14,56,52}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfa,{net_kernel,start_link,[[tsung_controller,shortnames]]}},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}  
  7. {error_logger,{{2010,12,13},{14,56,52}},supervisor_report,[{supervisor,{local,kernel_sup}},{errorContext,start_error},{reason,shutdown},{offender,[{pid,undefined},{name,net_sup},{mfa,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}  
  8. {error_logger,{{2010,12,13},{14,56,52}},std_info,[{application,kernel},{exited,{shutdown,{kernel,start,[normal,[]]}}},{type,permanent}]}  
  9. {"Kernel pid terminated",application_controller,"{application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}}"}  
  10. Crash dump was written to: erl_crash.dump  
  11. Kernel pid terminated (application_controller) ({application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}})  
  12. [2]-  Exit 1                  tsung start  

刚开始以为是注册用户时有重名的用户所至,但检查服务器上一个用户也没有创建成功,因此排除,经过一段时间的排错,发现是因为前一个进程没有关闭所致,因此杀掉原来的进程:

[php] view plaincopy
  1. $ ps aux | grep erlang   
  2. web      16281  0.0  0.0   1956   524 ?        S    11:53   0:00 /usr/lib/erlang/erts-5.7.4/bin/epmd -daemon  
  3. web      17822  0.0  0.4  49336  9380 pts/2    Tl   14:36   0:00 /usr/lib/erlang/erts-5.7.4/bin/beam.smp -P 250000 -A 16 -K true -- -root /usr/lib/erlang -progname erl -- -home /home/web -- -smp auto -rsh ssh -noshell -sname tsung_controller -setcookie tsung -boot /usr/lib/erlang//lib/tsung_controller-1.3.3/priv/tsung_controller -boot_var TSUNGPATH /usr/lib/erlang/ -pa /usr/lib/erlang//lib/tsung-1.3.3/ebin -pa /usr/lib/erlang//lib/tsung_controller-1.3.3/ebin -tsung_controller smp_disable true -tsung_controller debug_level 5 -tsung_controller config_file "/home/web/.tsung/tsung.xml" -tsung_controller log_file "/home/web/.tsung/log/tsung.log"  
  4. web      18978  0.0  0.0   3548   816 pts/2    R+   15:53   0:00 grep erlang  
  5. web@local:~/.tsung$ kill -9 17822  

 

再运行 tsung start , 终于看到输出到日志文件了!

检查服务器用户,正在不断的创建用户。嗯?怎么创建了1000个左右的用户就结束了呢?我的目标是要创建200000个用户呀,查看日志是因为用户open file 最大数限制, 修改系统最大连从接从1024到65535 ,无效!

后来才发现配置文件中还有一个重要的参数:maxusers, 于是增加到配置文件中:

[xhtml] view plaincopy
  1. <clients>  
  2.     <client host="localhost" use_controller_vm="true" maxusers="60000">  
  3.     </client>  
  4. </clients>  

 

这次终于大功告成。 用户源源不断地创建到了openfire 中。

 

 

3、压力测试完成后, 需要出统计报表进行报告:

进入日志的目录:cd ~/.tsung/log/20101213-09:32

运行脚本文件: /usr/lib/tsung/bin/tsung_stats.pl

 

报错,不能生成图片(曲线图):

[php] view plaincopy
  1. $ /usr/lib/tsung/bin/tsung_stats.pl  
  2. creating subdirectory data   
  3. creating subdirectory images   
  4. creating subdirectory gnuplot_scripts   
  5. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  6. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  7. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  8. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  9. No data for Event  
  10. No data for Async  
  11. No data for Errors  
  12. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  13. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  14. Error while running gnuplot: 对设备不适当的 ioctl 操作 at /usr/lib/tsung/bin/tsung_stats.pl line 167.  
  15. Can't locate Template.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /usr/lib/tsung/bin/tsung_stats.pl line 367.  
  16. web@spider:~/.tsung/log/20101213-08:12$   

于是安装生成图片的依赖包: 

sudo apt-get install gnuplot

图片生成了, 但还是报模板找不到:

[php] view plaincopy
  1. $ /usr/lib/tsung/bin/tsung_stats.pl  
  2. No data for Event  
  3. No data for Async  
  4. No data for Errors  
  5. Can't locate Template.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /usr/lib/tsung/bin/tsung_stats.pl line 367.  

 

 继续安装缺少的模板依赖:

sudo apt-get install perl5 
sudo apt-get install libtemplate-perl

 

安装成功,html的报表也出来了, 到此为止。

 

4、接下来进行了40W用户的注册测试,以及在线用户测试。压力是出来了, 接下来的问题是openfire服务器上文件打开数限制导致的错误了,继续进行。。。。




因为单台PC电脑性能限制,产生的压力上不去,因此这两天研究了一下多台电脑协同进行压力测试:

1、为每台电脑建立相同的用户,并打通SSH无密码访问。

     具体做法见本人上一篇文章。

2、为每台电脑配置hosts,使用root权限修改/etc/hosts文件。

     192.168.0.2   test02

     192.168.0.3   test03

     192.168.0.4   test04

     192.168.0.5   test05

3、修改tsung的配置文件,在原来clients中修改为如下内容:


<clients>
<client host="test02" use_controller_vm="true" maxusers="300000"></client>
<client host="test03" use_controller_vm="true" maxusers="300000"></client>
<client host="test04" use_controller_vm="true" maxusers="300000"></client>
<client host="test05" use_controller_vm="true" maxusers="300000"></client>
</clients>

4、根据实际情况使用下面内容产生压力

<load>
   <arrivalphase phase="1" duration="20" unit="minute">
      <users arrivalrate="1000" unit="second"></users>
   </arrivalphase>
</load>

5、压力测试中可能会遇到许多错误。可以修改电脑的参数来加以调整。

   (1)修改/etc/security/limits.conf 增加以下内容增加同时打开文件的句柄

            *    soft    nofile   65535

            *    hard   nofile   65535

   (2)修改/etc/profile  增加以下内容使用每次用户登录时设置为65535

            limits -HSn  65535

   (3)修改 /etc/sysctl.con 减少errot_connect_eaddrinuse错误

        echo net.ipv4.ip_local_port_range =32768 61000 >> /etc/sysctl.conf

        sysctl -p