Openfire 性能优化
Openfire 是一个XMPP协议的IM Server。
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试试,或者和我们一样,自己写通讯服务器。
以下内容参考文章:http://blog.csdn.net/jinzhencs/article/details/50404574
其他设置以及优化
插件
- Subscription插件:自动同意好友请求,添加插件后在服务器设置最下面设置方式。
服务器设置
- 把没用的一些设置关掉,例如HTTP绑定等等
优化
- 修改打开最大文件数目:ulimit –n 65535
- 设置服务器缓存大小,系统属性加入:
// 注意不能有空格,特别是 size后面
// -1代表无穷大 100000000即是95M
ClientSessionInfoCache: cache.ClientSessionInfoCache.size
Roster: cache.username2roster.size
user: cache.userCache.size
group: cache.group.size
groupMeta: cache.groupMeta.size
offline message: cache.offlinemessage.size
offlinePresence: cache.offlinePresence.size
Last Activity Cache: cache.lastActivity.size
VCard: cache.VCard.size
// 以上都是高压下容易飘红的
要重启openfire服务才能更新过来哦
未来需要优化的几个点:
1.加大服务器内存 20G变成150G
2.之前源码修改的是3.10.2,之后把新版本的源码下载下来重新修改,而后打包部署.
以解决3.10.2遗留的BUG(现在4.0beta版本出来了,可能过段时间会开源,改了很多bug)
3.根据需求定制openfire,即去除无用的组件,出去无用的消耗资源的一些cache或hashMap,变量之类
4.移出session,把session存入到redis中。
5.除了session,其他的很多cache(服务器缓存)全部移入redis。
openfire不使用mysql,使用redis作为数据库存储数据,再做个mysql持久化及主从就行了。
论坛有牛人说过:openfire使用了它那不知所谓的cache(其实就是HashMap),就注定无法支撑数十万连接。
(强哥说了:HashMap存储超过几万后,会有问题,好像是jdk自带的问题) 另外一个最重要的优化的方面,就是保证连上服务器的是 有用 的用户。
譬如我们服务器之前连了10W,但是其实真正用户绑定并使用XX系统的只有1W,但是10W个客户端却是连着的。 (举例子,之前我们的系统就好比进入淘宝后台自动登录旺旺,那么进淘宝多少人就有多少人登录了旺旺,但是其实真正使用旺旺的只有十分之一甚至更少,我们只需要让用户在需要旺旺对话的时候才连接服务器的话,那么瞬间服务器压力能减少 90% 这是比任何优化方案都有效的解决方法。是从业务本身去思考并优化,这个需要集思广益。)
Openfire 性能优化的更多相关文章
- openfire性能调优
1. 参考 http://blog.csdn.net/foxisme2/article/details/7521139 http://blog.csdn.net/foxisme2/article/de ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- JavaScript性能优化
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...
- 02.SQLServer性能优化之---牛逼的OSQL----大数据导入
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...
- C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...
随机推荐
- Linux命令之dig命令挖出DNS的秘密
=== [初次见面] 我相信使用nslookup的同学一定比使用dig的同学多,所以还是有必要花些时间给大家介绍一下dig的. dig,和nslookup作用有些类似,都是DNS查询工具. dig,其 ...
- 初涉yield
function* a(i) { console.log('here we go'); yield i; // 必须有*,不然b会作为返回值,而不是执行 yield* b(i); yield i+10 ...
- css控制单行文本溢出
1.溢出属性(容器的) overflow:visible/hidden(隐藏)/scroll/auto(自动)/inherit; visible:默认值,内容不会被修剪,会成现在元素框之外: hidd ...
- 常用 Java Profiling 工具的分析与比较
转自:http://www.ibm.com/developerworks/cn/java/j-lo-profiling/index.html 在 Java 程序的开发过程中,不可避免地会遇到内存使用. ...
- scala windows 安装
下载 https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.msi 第一步:设置 右击我的电脑,单击"属性",进入 ...
- HTML5 canvas绘制arcTo、translate和rotate的画法探索
arcTo(x1,y1,x2,y2,radius) ; 还要加上moveTo的点(x0,y0) ; 第一步:找到切点 过点 (x1,y1), (x0,y0)引射线与点(x1,y1),(x2,y2) ...
- JavaScript的类型体系
一:总体的类型系 基本类型:数字类型(number),字符串类型(string),布尔类型(boolean); 复合类型:对象(对象,函数,数组等); 无类型:null(有定义),undefined( ...
- 【面试总结-编程】多行两列数据,实现同key的value求和并输出
一个文件,两列,多行. 第一列是字母,第二列是数字,同列数据之间通过空格分割. 统计首列字母相同的第二列之和. 样例输入: A 5 B 6 OO 7 A 6 A 2 OO 2 输出: A:13 B:6 ...
- java反射,代码优化
java的反射机制属实强大,能解决好些问题 在接手别人写的代码的时候,有一个bean类的get方法特别low,我都看不下去 重复代码写五遍,我都觉得太不合理.之后将其中代码抽取出来修改了下. publ ...
- java学习助手
感谢大家使用Java学习助手! 打一开始,这应用就是全开源,希望大家自觉遵循开源协议,还Android开发一片净土(国内的情况你懂的) 接下来都不会更频繁更新文章,大家更应该把注意力放在基础的模块那里 ...