小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

openfire mysql 轉(zhuǎn)mongo 注冊行為性能測試及其他

 WindySky 2016-03-14

測試同學(xué)使用tsung測試openfire時(shí)發(fā)現(xiàn)注冊并發(fā)數(shù)過低,同事經(jīng)過測試認(rèn)為數(shù)據(jù)庫是最大瓶頸,建議將mysql數(shù)據(jù)庫改造成mongo數(shù)據(jù)庫。


首先嘗試改造了ofUser表相關(guān)操作,使注冊邏輯整體走mongo:

改造涉及文件如下:

在org.jivesoftware.database 包下仿照DefaultConnectionProvider、DbConnectionManager創(chuàng)建mongo的相關(guān)Provider和Manager

為了減輕字段映射壓力,使用了morphia,因此,需要?jiǎng)?chuàng)建相應(yīng)的pojo,如ofUser.java

改造所有涉及ofUser表的增刪改查


由于原來為了適應(yīng)多種數(shù)據(jù)庫,所以在其中增加了很多判斷,搞明白邏輯后可以去除這些判斷。

mongo連接方面參考了以下文章:

http://www./Linux/2012-01/52150.htm

http://www.cnblogs.com/huangfox/archive/2012/04/01/2428947.html

http://blog.csdn.net/magicfoxhu/article/details/7568728

openfire數(shù)據(jù)庫相關(guān)參考了下面的文章:

http://www./database/1249683.html

mongo的api及文檔:

http://api./java/2.8.0/

http://docs./manual/genindex/

java操作mongo:

http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html

http://tech.it168.com/a2011/0617/1206/000001206231_all.shtml

http://blog.sina.com.cn/s/blog_5d3241cc0100q7yp.html

http://www./database/201202/118157.html

http://www.cnblogs.com/yuechaotian/archive/2013/02/04/2891416.html

http://blog.csdn.net/mengxiangyue/article/details/8957085

使用morphia:
http://my.oschina.net/u/142072/blog/35714

http://wenku.baidu.com/view/83b56947a8956bec0975e357.html

http://www./watchzerg/archive/2012/09/20/388109.html

http://www.cnblogs.com/hoojo/archive/2012/02/17/2355384.html

在尋找的時(shí)候還發(fā)現(xiàn)了個(gè)特好玩的morphia使用者:

https://github.com/turbidsoul/turbidsoul.github.io/commit/fe4bcdc7238b24ed06aaf327e3470ced676d1b27

在做pojo的時(shí)候特意研究了下objectid呀~發(fā)現(xiàn)了很多好東東哦~

http://www.cnblogs.com/xjk15082/archive/2011/09/18/2180792.html

http://www./database/20120317/319007.html

http://blog./html/3511.html

——————————————分割線————————————————————————————————————————————————————————

改造完成開始性能測試:
使用tsung測試:500請求/s 運(yùn)行5分鐘

數(shù)據(jù)庫插入數(shù)/理論插入數(shù),

mysql注冊基本穩(wěn)定在75%

mongo注冊基本穩(wěn)定在30%?。。?!

震驚了我,mongo的性能怎么可能這么差??!

趕緊查查mongo性能提升相關(guān)的文檔:

http://database.51cto.com/art/201109/293088.htm

第一條:是否建立索引,果然,我并沒有建立索引,而在注冊時(shí)需要先查一下此用戶是否存在再進(jìn)行插入,查詢對索引需求大,建立索引,參考如下文檔:

http://blog.sina.com.cn/s/blog_af52238c0101bhno.html

建立username索引,再次測試:

mongo注冊率穩(wěn)定在76%

松了一口氣,但是只幣mysql高1%,這可不行,開始監(jiān)控mongo性能,參考:

http://www./mongo-mem/1489.html

http://www.cnblogs.com/shanyou/archive/2010/10/02/1841348.html

http://blog.csdn.net/liubo2012/article/details/8203751

發(fā)現(xiàn)mongo一直處于非繁忙狀態(tài),高并發(fā)行為并沒有對其產(chǎn)生壓力。只有少數(shù)insert方法執(zhí)行速度超過10ms,但是數(shù)量極少

懷疑代碼或者測試工具有問題,修改代碼:

(1)去除邏輯中的query妹紙保留insert,性能沒有提升--》性能與query無關(guān)

(2)關(guān)閉性能監(jiān)控,性能沒有提升--》性能與性能監(jiān)控?zé)o關(guān)

(3)刪除索引,性能沒有提升--》性能與索引無關(guān)

(4)不使用morphia方法使用driver自帶方法--》性能沒有提升,與morphia方法無關(guān)

(5)去除db重連邏輯--》性能沒有提升,與此邏輯無關(guān)

(6)使用morphia save方法,每1000個(gè)注冊請求,調(diào)用一次--》性能下降,原因:morphia.save并非調(diào)用批量方法,積攢1000個(gè)請求在使用此方法依舊是一個(gè)個(gè)插入,反而增大了壓力。解決:改造成driver自帶insert 批量插入方法,上升至76%,--》與批量無關(guān),但是批量插入的確比單個(gè)效果更好,(貌似批量操作會有全局鎖問題,需要查看http://blog./uid-26660567-id-4106642.html)

(7)增大客戶端單機(jī)連接數(shù),20改為400,性能無明顯變化,查詢資料:http://blog.csdn.net/jollyjumper/article/details/8553307,增加連接數(shù)反而可能使性能下降。




--依舊原因未知,實(shí)驗(yàn)mongo shell循環(huán)插入10w條。參考:

http://www./other-database/383981.html

10w條用時(shí)40s,監(jiān)控mongo性能,返現(xiàn)在使用mongo shell循環(huán)插入10w條時(shí)壓力比tsung 500 并發(fā)高。再次確定mongo應(yīng)對壓力無問題。

無法,開始使用笨辦法:查看數(shù)據(jù)庫數(shù)據(jù),希望能行數(shù)據(jù)中找到缺失規(guī)律,還真被我找到了??!--

插入6000條數(shù)據(jù),前5335條插入無丟失,只丟失5336-6000的數(shù)據(jù)。推測一定不是并發(fā)造成的丟失。

在代碼邏輯的insert語句前打印日志,與數(shù)據(jù)庫數(shù)據(jù)進(jìn)行對比,發(fā)現(xiàn)日志打印數(shù)與插入數(shù)據(jù)庫數(shù)完全相同,再次確認(rèn)與數(shù)據(jù)庫無關(guān),推測可能是自行修改的mongo邏輯和mysql邏輯不通導(dǎo)致,測試mysql邏輯,發(fā)現(xiàn)打印日志數(shù)與插入數(shù)據(jù)庫數(shù)依舊相同---》確定數(shù)據(jù)庫絕對無壓力。

————————————————————————————我是無奈的分割線————————————————————————————————

忽然被告知,測試同學(xué)配置的tsung有問題。啊啊啊啊啊啊啊==。。。明天使用同事自己做的壓測工具。。


其他參考文檔:

關(guān)于Mysql和Mongo的性能測試

 http://blog.sina.com.cn/s/blog_591888d50101jx67.html

Openfire 性能優(yōu)化 http://blog.csdn.net/blade2001/article/details/9094331

java鏈接mongo   http://blog.csdn.net/freebird_lb/article/details/7470384

________第二天的分割線——————————————————————————————

使用了asmack組件提供的接口,瞬間創(chuàng)建多線程施壓測試,測試環(huán)境(Intel(R) Xeon(R) CPU 2.13GHz  ,內(nèi)存:4139668 kB,64位)

mongo最長消耗時(shí)間是mysql最長消耗時(shí)間的2/5左右。

mongo在高并發(fā)注冊情況下,成功率遠(yuǎn)高于mysql,具體數(shù)據(jù)如下:

數(shù)據(jù)庫類型 方式 總發(fā)送請求數(shù) 失敗數(shù) 請求完成時(shí)長 成功數(shù) 總實(shí)時(shí)長 每秒完成數(shù) 備注
Mongo 10000線程,每個(gè)線程發(fā)送2次請求 20000 0 48001 20000 8650492 416.6579863
Mongo 20000線程,每個(gè)線程發(fā)送1次請求 20000 0 49708 20000 6905026 402.3497224
Mongo 30000線程,每個(gè)線程發(fā)送1次請求 30000 0 72908 30000 12203271 411.4774785
Mongo 38000線程,每個(gè)線程發(fā)送1次請求 38000 1391 99858 36609 20398798 366.610587
Mongo 38000線程,每個(gè)線程發(fā)送1次請求 38000 0 88637 38000 12488874 428.7148708
Mongo 385線程,每個(gè)線程發(fā)送100次請求 38500 0 88597 38500 32518607 434.55196
Mongo 385線程,每個(gè)線程發(fā)送100次請求 38500 0 89802 38500 32518607 428.7209639
Mongo 3850線程,每個(gè)線程發(fā)送10次請求 38500 1878 99142 36622 36155249 369.3893607
Mongo 3850線程,每個(gè)線程發(fā)送10次請求 38500 0 85427 38500 29957272 450.6771864
Mongo 38500線程,每個(gè)線程發(fā)送1次請求 38500 0 90267 38500 15107830 426.5124575
Mongo 38500線程,每個(gè)線程發(fā)送1次請求 38500 0 89531 38500 12403008 430.0186528
415.0619297 平均值



所有mongo請求不成功問題都是由于以下問題造成的
錯(cuò)誤:
Nested Exception:
java.net.NoRouteToHostException: Cannot assign requested address
         at java.net.PlainSocketImpl.socketConnect(Native Method)
         at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
         at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
         at java.net.Socket.connect(Socket.java:529)
         at java.net.Socket.connect(Socket.java:478)
         at org.jivesoftware.smack.proxy.DirectSocketFactory.createSocket(DirectSocketFactory.java:28)
         at org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:555)
         at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:999)
         at Main.runRegisterTest(Main.java:54)
         at Main$3.run(Main.java:402)

原因:由于快速創(chuàng)建連接,端口被占用滿,產(chǎn)生TIME_WAIT 端口
解決方案:http://bbs./thread-3842444-1-1.html
不能確定影響范圍,暫時(shí)不進(jìn)行解決
第二解決方案:
研究發(fā)現(xiàn),Linux對外的隨機(jī)分配端口是由一定限制的,理論上單機(jī)對外的端口最大值為65535,除去一些保留端口和被占用端口外,也應(yīng)該在6W左右,但實(shí)際上單機(jī)建立對外連接時(shí),默認(rèn)不超過28232個(gè)連接。
    執(zhí)行以下命令就很清楚原因了:
    $ cat /proc/sys/net/ipv4/ip_local_port_range
輸出結(jié)果為:
    32768   61000
    這就是Linux隨機(jī)分配端口的范圍,如果在該范圍內(nèi)有被占用的端口,那么連接數(shù)肯定小于28232.如果想更改這個(gè)范圍,可以執(zhí)行以下命令:
    # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range


檢測發(fā)現(xiàn)Mongo性能情況一直良好,基本無等待隊(duì)列產(chǎn)生


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多