Openfire性能優化與壓力測試小結
Openfire配置:
Ubuntu安裝Openfire后性能極低,壓力測試只能到4000在線用戶數。
第一步 修改Openfire運行環境
通過ps -aux | grep openfire查看openfire服務能觀察到啟動命令為:
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -server -DopenfireHome=/usr/share/openfir -Dopenfire.lib.dir=/usr/share/openfire/lib -classpath /usr/share/openfire/lib/startup.jar -jar /usr/share/openfire/lib/startup.jar
首先看到這里用的JVM是openjdk提供的,性能不行,因此先kill掉這個進程(如果不是使用Openjdk就不需要這個操作了)。Kill掉再執行ps看看是不是真正被改掉了,然后切換到root下執行 /etc/init.d/openfire start。再次查看已經切換成自己的JDK路徑了,前提是配置過JDK。
/home/david/java/jdk1.8.0_05//bin/java -server -DopenfireHome=/usr/share/openfire -Dopenfire.lib.dir=/usr/share/openfire/lib -classpath /usr/share/openfire/lib/startup.jar -jar /usr/share/openfire/lib/startup.jar
第二步 epoll方式修改:
為提高性能需要更改啟動命令為NIO支持epoll,需要修改/etc/init.d/openfire腳本文件。將DAEMON_OPTS改為
DAEMON_OPTS="$DAEMON_OPTS -server -Xms3072m -Xmx4096m -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -DopenfireHome=${DAEMON_DIR} \
-Dopenfire.lib.dir=${DAEMON_LIB} -classpath ${DAEMON_LIB}/startup.jar\
-jar ${DAEMON_LIB}/startup.jar"
主要加入了-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider這個選項,注意這里還修改了jvm內存使用大小。
tsung壓力測試:
第一步 修改打開最大文件數目
不做任何修改的主機安裝tsung做壓力測試時發現最多只能到達1000左右的在線用戶數,錯誤為emfile執行ulimit –n查看為1024,意思是打開的文件太多了,默認為1024個。執行ulimit –n 65535,這個65535隨便一個大點的數字就好。長期修改需要修改/etc/security/limits.conf,加入:
root - nofile 65535
注:root必須明確寫上root不能使用*。
第二步 修改端口范圍
繼續做壓力測試發現到達28000左右壓力就上不去了,錯誤為eaddrinuse,這個時候是端口不夠用了。需要修改/etc/sysctl.conf,加入:
net.ipv4.ip_local_port_range = 1024 65000
將端口可分配的范圍增加到6W多個,執行sysctl –p立即生效,通過sysctl –a | grep range查看是否已經有變化。此時再去做壓力測試就能發現在線用戶數已經到達了6W個。
第三步 tsung集群
一臺機模擬6W用戶在線就已經到極限了,此時需要多臺tsung測試機來進行測試。每臺測試服務器上需要安裝相同的erlang和tsung版本,并且通過 root能夠無密碼登錄(root可能非必須)。另外特別注意的一點是機器名稱不能使用lc-optex之類的,中間的“-”在erl中會導致無法連接,直接取名kf2lc這樣就OK了。
以三臺測試機(可以用虛擬機采用橋接模式)為例,假設機器名稱為kf2test01、kf2test02、kf2test03,IP分別對應為172.28.23.180、172.28.23.181、172.28.23.182。
分別在在各機器的/etc/hosts上加入:
172.28.23.180 kf2test01
172.28.23.181 kf2test02
172.28.23.182 kf2test03
Kf2test01切換到root后執行ssh kf2test02,如果無密碼登錄就OK了,提示輸入密碼的話需要改為無密碼登錄。其它機器做相同的連接測試,保證能夠相互無密碼登錄。
此時ulimit –n查看遠端服務器最大文件數限制仍然為1024,會導致集群的從服務器最大只能創建1000個左右的模擬用戶,需要在/etc/profile中加入:
ulimit -SHn 65535
在tsung測試壓力前可以通過執行erl來測試集群是否成功,shell中執行erl:
>erl -rsh ssh -sname root -setcookie mycookie
Eshell V5.8.5 (abort with ^G)
(root@kf2test01)1>slave:start(kf2test02,root,"-setcookie mycookie").
如果返回ok則表示成功,如下:
{ok,root@kf2test02}
無法集群則會半天無反應,最后顯示{error,timeout}。
配置好tsung后,修改jabber.xml配置:
<clients>
<client host="kf2test01" use_controller_vm="false" maxusers="60000">
<ip value="172.28.23.180"/>
</client>
<client host="kf2test02" use_controller_vm="false" maxusers="60000">
<ip value="172.28.23.181"/>
</client>
<client host="kf2test03" use_controller_vm="false" maxusers="60000">
<ip value="172.28.23.182"/>
</client>
</clients>
然后執行tsung –f jabber.xml進行集群壓力測試。通過這樣方式測試理論上能達到18W模擬用戶。以下是測試輸出報告:
Openfire性能優化的一些思考:
1.現在服務器連接并發量才1400多,通過加入連接管理器(CONNECTION MANAGER)實現大并發,前端需要加入負載均衡服務器(Load Banlancer)或DNS來實現分流。
2.Openfire直接連接數據庫,需要加入memcached作為數據庫緩存。
3.Openfire集群據說有性能問題,需要找到瓶頸。
4.服務器最終應選為CentOS,而非ubuntu。