有一個(gè)J2EE項(xiàng)目,碰到一些性能問(wèn)題。客戶用LoadRunner測(cè)試,十個(gè)用戶并發(fā)測(cè)試登錄,就導(dǎo)致系統(tǒng)崩潰。經(jīng)過(guò)檢查,發(fā)現(xiàn)是數(shù)據(jù)池設(shè)置的太小,在IBM WPS里面設(shè)置的數(shù)據(jù)池缺省是1-10,結(jié)果當(dāng)用5個(gè)并發(fā)測(cè)試的時(shí)候,就總是有5個(gè)進(jìn)程在等待數(shù)據(jù)連接。這樣,系統(tǒng)自然通不過(guò)測(cè)試了。后來(lái)把數(shù)據(jù)池改大了,測(cè)試通過(guò),而且速度飛快。
J2EE的性能問(wèn)題,是Java誕生以來(lái)就一直存在的問(wèn)題,盡管這些年間已經(jīng)有了非常大的改進(jìn),但畢竟還是不如C等代碼生成的程序。但我們?cè)谂龅絁2EE程序性能的時(shí)候,卻不能總把問(wèn)題歸咎于Java的問(wèn)題。事實(shí)上,在很大程度上,J2EE碰到的性能問(wèn)題,都是環(huán)境方面的配置問(wèn)題。
簡(jiǎn)單列舉一下J2EE可能碰到的性能方面的一些可能原因:
1、JVM內(nèi)存分配的問(wèn)題。JVM如果沒(méi)有單獨(dú)設(shè)置,缺省使用的內(nèi)存是比較有效的,好像是32M。這樣的內(nèi)存,對(duì)于大并發(fā)訪問(wèn)是遠(yuǎn)遠(yuǎn)不夠的,需要根據(jù)服務(wù)器的內(nèi)存情況進(jìn)行優(yōu)化,這時(shí)候常常會(huì)拋內(nèi)存溢出的錯(cuò)誤。但也不能無(wú)限大,JVM最多只能使用2G的內(nèi)存。比如,通常可以設(shè)置為 -Xms512m -Xmx1024m。
2、WEB服務(wù)器的并發(fā)服務(wù)線程數(shù)。通常的WEB容器都有這樣一個(gè)限制,比如Tomcat缺省是75.這時(shí)候,如果使用LoadRunner等進(jìn)行100用戶并發(fā)測(cè)試,則肯定有不少請(qǐng)求會(huì)等待,而不是完全執(zhí)行。WebLogic的缺省設(shè)置好像更小,我記得反正不到30.如果在實(shí)際使用中,發(fā)現(xiàn)這個(gè)并發(fā)線程數(shù)是瓶頸,則可以調(diào)得更大一些。
3、數(shù)據(jù)池的大小,這正好是朋友碰到的問(wèn)題。通常情況下,數(shù)據(jù)池的大小,應(yīng)該略大于WEB服務(wù)器的并發(fā)服務(wù)線程數(shù)。我們至少要保證每個(gè)WEB進(jìn)程都能獲取到相應(yīng)的數(shù)據(jù)連接。如果每個(gè)WEB進(jìn)程,可能需要多個(gè)數(shù)據(jù)連接,這時(shí)候數(shù)據(jù)池也應(yīng)該相應(yīng)調(diào)整的更大。
4、數(shù)據(jù)表的索引問(wèn)題。對(duì)普通程序員,碰到性能問(wèn)題的時(shí)候,很難想到表索引的問(wèn)題。特別是針對(duì)大數(shù)據(jù)量的數(shù)據(jù)表,有沒(méi)有合理索引的情況,查詢的效率,往往是幾十上百倍。建索引之前一個(gè)小時(shí)才能完成的任務(wù),如果有合理的索引,可能1分鐘不到就能搞定。索引的最簡(jiǎn)單的設(shè)置規(guī)則,就是把Where、Order子句中的所有字段都建上索引。
從以上這幾個(gè)方面,往往能解決大部分的性能問(wèn)題。
再來(lái)說(shuō)說(shuō)碰到性能問(wèn)題的時(shí)候大概的思路。原則只有一個(gè),就是“定位問(wèn)題所在”。
1、查看服務(wù)器日志,日志里面的很多的有用信息,能從中初步發(fā)現(xiàn)問(wèn)題所在。
2、結(jié)合日志,查看相應(yīng)的設(shè)置,并對(duì)服務(wù)器進(jìn)行監(jiān)控。然后對(duì)參數(shù)進(jìn)行必要的調(diào)整,繼續(xù)測(cè)試。
3、如果定位到是數(shù)據(jù)庫(kù)上是瓶頸,就要檢查相應(yīng)的數(shù)據(jù)表的索引設(shè)置。有些數(shù)據(jù)庫(kù)提供SQL語(yǔ)句的監(jiān)控和性能分析,可以分析出一些有用的結(jié)論。
以上只是一些初步的指導(dǎo)。如果一些初步的設(shè)置解決不了問(wèn)題,則需要進(jìn)一步細(xì)化了。
比如說(shuō)索引的問(wèn)題,簡(jiǎn)單的規(guī)則是給所有Where子句后面的字段添加索引。但這條規(guī)則太簡(jiǎn)單,某些情況下并不適用,這時(shí)候就要根據(jù)數(shù)據(jù)表的數(shù)據(jù)量、數(shù)據(jù)的差異、SQL語(yǔ)句等進(jìn)行仔細(xì)調(diào)整。這就需要更多的經(jīng)驗(yàn)、更仔細(xì)的調(diào)試才能得到更好的效果。
如果以上都解決不了問(wèn)題,這時(shí)候就要考慮代碼上是不是需要優(yōu)化了。
posted on 2007-07-11 15:48
Scott.Pan 閱讀(485)
評(píng)論(0) 編輯 收藏 所屬分類:
SSH 、
J2EE