優化openfire服務器,達到單機20萬,集群50萬


 

openfire壓測概述

Openfire 采用Java開發,基於XMPPJabber)協議,開源的即時通訊服務器。一直以來,對於服務器的支持最大用戶數總是讓人感到疑問,官方甚至還是幾年前的5k。在熟悉了openfire源碼后,我決定花些時間測試一下openfire的極限。經過約1個月左右的測試,總算得到預定目標(3台服務器,並發50w用戶在線)

 

測試環境搭建

壓測客戶端無他-tsung,嘗試了windows安裝perl失敗后,使用centOS6.5作為壓測機

壓測服務器,因為集群需要大內存,因而安裝了64位的centos6.7.

所幸這些都可以使用vmware虛擬機,只要裝好一台,通過簡單copy就能復制出多台.實際上,一共也就使用了6台硬件設備.

設備類別

台數

系統

虛擬機操作系統

說明

OF服務器

3

i54570,12G,Win7

CentOS6.7 8G

其中一台運行mysql數據庫

tsung客戶機

3

i54570,4G,Win7

CentOS6.5 1G

虛擬機1G內存,運行3個實例

 

jvisualvm+mat使用

如果不跑集群,其實openfire還是比較穩定的,單台4G內存情況下,也有運行到25W同時在線的情況。一旦用了hazelcast,反而不穩定了,出現問題就需要使用工具進行定位,看看哪里堵住了。

 

運行結果與心得:

0.千萬不要用OpenJdk的虛擬機,官方推薦用CMS進行GC,那就老實點用JDK7.

1.openfire使用mina作為nio底層實現.實測一秒20-25個新連接還算穩定,超過30個就會堵住.(占用大量內存存儲未處理的包-經查,時offlineMessage堵住,tsung去掉發送消息的,就快了)

2.openfire使用hazelcast的緩存機制實現集群。經過實際測試,這貨太消耗內存了,20w連接大概需要4G的內存(包含mina連接需要的內存),加上還要互為主備的機制,至少還要1.5G才能實現集群的使用。測試至少要8G內存才行,實際使用推薦12G以上.

3.僅僅是壓測同一台服務器,與同時壓測多台情況大不相同,后期改進主要集中在數據庫性能.(后期改進點-)

4.Linux內核修改limits.conf和net.nf_conntrack_max參數后性能有所提升。

 

程序優化點:

1.JVM配置優化:

    需要自己修改openfire.sh,增加虛假機參數.(hazelcast插件有推薦配置,修改一下就行)

2.offlineMessageStore+squenceManager優化:

    前面說過了,mysql最多支持每秒30個的NextID,實際運行offlineMessage會很多,修改使用redis保存離線消息。

3.hazelcast和openfire優化:

    hazelcast本身就很多問題,例如一台設備內存滿了或者處理超時,那么整個集群就沒響應了。如果還是用hazelcast作為集群的緩存,需要剝離到單獨的設備上去。

    openfire用的是java的序列化,內存用的多,效率慢;hazelcast是支持自定義序列化的,經過比較,我用了kryo作為序列化工具,在對ClientSessionInfo,Roster,RosterItem,User這幾個類優化后,內存使用明顯小了很多。

    SessionManager 把所有的clientSession都放到hashmap中,當用戶變得非常大量時候,sessionInfoCache的操作必然影響效率。

4.登錄流程簡化:

  xmpp的登錄報文交互太多了,雖然tsung使用最簡單的iqauth登錄,實際使用還是需要簡化登錄流程,這點需要客戶端配合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM