MongooseIM (websockets) 的 Tsung 负载测试

Posted

技术标签:

【中文标题】MongooseIM (websockets) 的 Tsung 负载测试【英文标题】:Tsung load testing for MongooseIM (websockets) 【发布时间】:2013-12-09 21:20:07 【问题描述】:

我的问题是关于配置我的 tsung.xml 文件以加载测试聊天应用程序。

所以,我们在服务器端有我们的 MongooseIM 服务器,jsjac.js 库用于我们基于 Web 的客户端。我们使用 xmpp 和 websockets 进行通信。

jsjac 的httpbase 看起来像ws://hostname:5288/ws-xmpp/,这部分对我来说很好用。 Tsung 是“开箱即用”的支持 websockets,每个人都说测试 websockets 的最好方法是使用 tsung。但是关于如何做到这一点的信息并不多。

这是我的 tsung.xml:

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
  <clients>
    <client host="localhost" use_controller_vm="true" maxusers="10" />
  </clients>

  <servers>
    <server host="hostname" port="5288" type="tcp" />
  </servers>

  <load>
    <arrivalphase phase="1" duration="10" unit="second">
      <users maxnumber="1" arrivalrate="1" unit="second" />
    </arrivalphase>
  </load>

  <sessions>
    <session name="websocket" probability="100" type="ts_websocket">
        <request subst="true">
             <websocket type="connect" path="/ws-xmpp"></websocket>
        </request>

        <request>
            <dyn_variable name="uid" jsonpath="uid"/>
            <websocket type="message">"user":"bob", "password":"bob"</websocket>
        </request>  

        <request subst="true">
            <match do="log" when="nomatch">ok</match>
            <websocket type="message">"uid":"%%_uid%%", "data":"data"</websocket>
        </request>

        <request>
        <websocket type ="message">"key":"value"</websocket>      
        </request>

        <request>
            <websocket type="close"></websocket>
        </request>
    </session>
  </sessions>
</tsung>

测试通过后的结果是:

connected: 0
finish_users_count: 1
users: 1
users count: 1
websocket_succ: 1

用户“bob”确实存在于服务器的数据库中,并且可以通过客户端应用程序正常工作。

谁能告诉我我做错了什么? 或者也许有人可以提供一些文章或工作 xml 文件的链接? 谢谢。

【问题讨论】:

【参考方案1】:

在 Websockets 上测试 XMPP 的最佳方法是使用具有特定服务器配置的标准 Jabber 场景:

<servers>
  <server host="localhost" port="5288" type="websocket"></server>
</servers>

<options>
  (...)
  <option name="websocket_path" value="/ws-xmpp"/>
</options>

可以找到示例 Jabber 场景,例如在 Tsung repo 的“examples”目录中。我认为那里使用了纯文本登录,所以如果您在连接用户时仍然遇到问题,请将事务“身份验证”替换为:

<transaction name="authenticate">
  <request><jabber type="auth_sasl" ack="local" /></request>
  <request><jabber type="connect" ack="local" /></request>
  <request><jabber type="auth_sasl_bind" ack="local" /></request>
  <request><jabber type="auth_sasl_session" ack="local" /></request>
</transaction>

【讨论】:

非常感谢!这个对我有用。您的回答和 jabber 场景示例正是我想要的。【参考方案2】:

有几件事要做...所以,首先,非常感谢 Piotr! 他的回答(+ jabber 场景示例)帮助解决了我的问题

这是我的工作 tsung.xml

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
  <clients>
    <client host="localhost" use_controller_vm="true"></client>
  </clients>
  <!-- Server side setup -->
 <servers>
  <server host="servernameOrIp" port="5288" type="websocket"></server>
 </servers>
  <load>
   <arrivalphase phase="1" duration="20" unit="second">
    <users interarrival="1" unit="second"></users>
   </arrivalphase>
  </load>
  <!-- JABBER parameters -->
 <options>
  <option type="ts_jabber" name="global_number" value="20"></option>
  <option type="ts_jabber" name="userid_max" value="20"></option>
  <option type="ts_jabber" name="domain" value="servernameOrIp"></option>
  <option type="ts_jabber" name="username" value="user00"></option>
  <option type="ts_jabber" name="passwd" value="user00"></option>
  <option name="websocket_path" value="/ws-xmpp"/>
 </options>

  <sessions>
   <session probability="100" name="jabber-example" type="ts_jabber">
    <request> <jabber type="connect" ack="no_ack"></jabber> </request>
    <thinktime value="2"></thinktime>
    <transaction name="authenticate">
    <request><jabber type="auth_sasl" ack="local" /></request>
    <request><jabber type="connect" ack="local" /></request>
    <request><jabber type="auth_sasl_bind" ack="local" /></request>
    <request><jabber type="auth_sasl_session" ack="local" /></request>
    </transaction>
    <request> <jabber type="presence:initial" ack="no_ack"/> </request>
    <thinktime value="10"></thinktime>
    <transaction name="roster">
      <request> <jabber type="iq:roster:get" ack="local"></jabber></request>
    </transaction>
    <thinktime value="10"></thinktime>
    <transaction name="online">
    <request> <jabber type="chat" ack="no_ack" size="16" destination="online"></jabber> </request>
    </transaction>
    <thinktime value="10"></thinktime>
    <transaction name="offline">
      <request> <jabber type="chat" ack="no_ack" size="56" destination="offline"></jabber> </request>
    </transaction>
    <thinktime value="2"></thinktime>
    <transaction name="close">
      <request> <jabber type="close" ack="no_ack"></jabber> </request>
    </transaction>
  </session>
 </sessions>
</tsung>

这个 tsung 会生成 20 个用户(user001 - user0020),我可以在我的“鲍勃”名册中看到他们。我使用 Spark IM 客户端来监控这一点。

【讨论】:

以上是关于MongooseIM (websockets) 的 Tsung 负载测试的主要内容,如果未能解决你的问题,请参考以下文章

XMPP 服务器 MongooseIM 是不是可以与 BOSH 或 WebSocket 一起使用?

MUC 消息的 MongooseIM 推送通知(不是 MUC 灯)

MongooseIM 可以在 PostgreSQL 后端处理多少用户?

如何在 mongooseim 服务器中从 sql 注册用户名密码字段

有没有像 MongooseIm mod_inbox 这样的 ejabberd 模块?

无法从MAC OS 10.14.2上的源代码安装MongooseIM