Openfire 性能优化

转载 2015年07月09日 12:14:53

Openfire  是一个XMPP协议的IM Server。

基于MINA的java nio服务器。

一般就是使用mysql来作为数据库,保存配置配置信息、离线信息、用户数据。

官网的数据是支持5000人同时在线,使用connectionManager可以实现支持3.3万人在线。

这数据一点都不漂亮,只能作为一个类似腾讯通的局域网聊天工具使用。

首先说点题外话,我测试用connectionManager。

这是一个openfire提供的连接管理器,作用其实是数据整流。

源码里是通过阻塞式多线程将信息通过特定端口与openfire提交数据。

测试之后的结果,这玩意严重影响效率,放弃,我们的目标不只是3.3万人。

Openfire使用mysql配合它不知所谓几乎无效的的Cache机制就注定无法支撑高并发,

所以第一步,将数据库切换为比较强一点的MongoDB。

但是MongoDB也是有问题的,在高并发时才会发现,MongoDB的锁表十分严重,

经过调查发现,MongoDB也比较坑爹,他是使用“全局锁”的,也就是说,你更新A表的时候,会锁住B表,数据更新后解锁。

所以作为实时查询数据库即使是使用MongoDB的master/slave模式依然不能胜任。

增加解决方案,缓存层,使用redis作为MongoDB的数据缓存,在访问时数据时,首先进入Cache层访问redis,如果没有,再去访问MongoDB,然后再回头填充Redis。

OK,数据源解决了,接下来确认需要在什么地方切入。

1,首先是将用户信息数据切换到MongoDB中。并停止Openfire自己的Roster服务,在管理控制台设置 xmpp.client.roster.active = false

2,AuthProvider,这里是登陆模块,可以继承接口重写一个属于自己的Provider。

重写authenticate方法,将登陆验证请求交给cache层。

3,离线信息的存储在之后也会成为负担,那么继承OfflineMessageStore类,重写属于自己的离线信息策略,将离线信息保存到Redis中。

4,重写状态更新的广播:PresenceUpdateHandler中的broadcastUpdate方法。

好了,这时候Openfire已经被修改的面目全非,但是效率已经不可同日而语了。

这时候还有一个问题,就是Openfire没有消息保障机制,也就是说,网络不稳定的时候,客户端异常断线,信息就会发送到空气中,

需要再发送信息的时候实现“握手机制”来保障信息的可靠性。不细说了,自己百度。

这时候Openfire的在线用户可以飚到6W无压力,但是死活上不去了,又被限制了。

在error.log中会发现类似 “open files too larger” 一类的错误,这些是linux系统参数:最大文件打开数。

在linux下执行ulimit -a就能观察最大的文件打开数,执行ulimit -n 350000设置为35万,然后kill掉openfire退出控制台,重新连接控制台使其生效,重新启动Openfire。

好吧,这时候用户量可以飙6W以上了。

XMPP服务器的测试工具,比较简单的可以使用tsung来实现,简单的配置,模拟成千上万的用户登陆,并且可以模拟HTTP等其他请求。

接下来就是单台服务器容量的问题了,我们服务器是Dell R710, 64G内存 16核CPU,15000转硬盘。

服务器在这种架构下在线用户数据在29W左右,几乎已经是单台Openfire封顶了。

开始考虑集群,不过Openfire的几种集群都测试过,效果不理想,有一个神马war包的插件,弄上去时好时坏,放弃。

还有一个oracle的集群插件,不过在高压下多台Openfire直接脱离集群,自己玩自己的了。。。日。

如果到了十万二十万左右的在线用户级别,就放弃掉Openfire,可以尝试使用tigase试试,尽管我没试过,不过看过源码,觉得还是比较可靠。

或者和我们一样,自己写通讯服务器。

优化openfire服务器,达到单机20万,集群50万

原文地址: http://www.android100.org/html/201601/28/212759.html openfire压测概述 Openfire 采用...
  • Tilter
  • Tilter
  • 2016年06月17日 14:25
  • 1004

openfire插件开发-Servlet插件

1.整个插件的目录 2.各个文件的代码 ExamplePlugin package org.jivesoftware.openfire.plugin; import java.io.File;...

OpenFire源码学习之十四:插件管理

Plugin管理 Openfire把插件模块加入到容器分为以下步骤: l 通过classloader加载lib目录下载的所有jar l 通过classloader加载dir目录下的所有文件 l...

Openfire在Linux下的性能优化

原文地址: 1.OpenFire的JVM参数优化(内存)   http://1976xyg.blog.163.com/blog/static/145653525201511156202925/ ...
  • Tilter
  • Tilter
  • 2016年06月17日 10:34
  • 1413

Openfire 性能优化

Openfire  是一个XMPP协议的IM Server。 基于MINA的java nio服务器。 一般就是使用mysql来作为数据库,保存配置配置信息、离线信息、用户数据。 官网...

Openfire 性能优化【转载内容】

Openfire 性能优化 http://blog.csdn.net/blade2001/article/details/9094331   Openfire  是一个XMPP协议的IM Server...
  • taizans
  • taizans
  • 2013年08月04日 14:18
  • 1193

Openfire 性能优化

Openfire  是一个XMPP协议的IM Server。 基于MINA的java nio服务器。 一般就是使用mysql来作为数据库,保存配置配置信息、离线信息、用户数据。 官网...

Openfire 性能优化

Openfire 性能优化 2012年05月28日 星期一 15:58 http://blog.csdn.net/smm11230704/article/details/746...

Openfire 性能优化

Openfire  是一个XMPP协议的IM Server。 基于MINA的java nio服务器。 一般就是使用mysql来作为数据库,保存配置配置信息、离线信息、用户数据。 官网...
  • educast
  • educast
  • 2014年04月07日 20:34
  • 2942

Openfire系列之性能优化与压力测试

Openfire配置: Ubuntu安装Openfire后性能极低,压力测试只能到4000在线用户数。   第一步 修改Openfire运行环境 通过ps -aux | grep openfi...
  • Tilter
  • Tilter
  • 2016年06月13日 16:54
  • 1498
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Openfire 性能优化
举报原因:
原因补充:

(最多只允许输入30个字)