struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37 +win2003
hibernate沒有做任何優(yōu)化,就是默認(rèn)的讓srping2.5來管理事務(wù)的.
做了一個(gè)注冊(cè)登錄的項(xiàng)目.這個(gè)項(xiàng)目是從第三方傳用戶數(shù)據(jù)和驗(yàn)證簽名過來,我必須要判斷用戶過來以后,數(shù)據(jù)沒有被修改,并且數(shù)據(jù)庫(kù)里沒有數(shù)據(jù),才可以注冊(cè).
因?yàn)橐玫酱髩毫Σl(fā),所以做了很多壓力測(cè)試,現(xiàn)在和大家分享一下.
在首先,我們并不有馬上做數(shù)據(jù)庫(kù)訪問,注冊(cè)等方面的壓力測(cè)試,而是先準(zhǔn)備把靜態(tài)頁(yè)面壓力測(cè)試到1000以上.
也就是把Tomcat配置好,讓它能處理這么大的并發(fā)頁(yè)面.
具體可以見我下面的文章:
hi.baidu.com/%CD%F5%D7%D36%BA%C5/blog/item/ff0f9724ff375f21d4074237.html
并發(fā)壓力測(cè)試到1000,很快就到了.具體配置在文章里有寫到.
接下來,就是做注冊(cè)登錄頁(yè)面了.具體的流程是這樣的.
在第一次是用的proxool數(shù)據(jù)連接池.
在100的并發(fā)的時(shí)候,是很勉強(qiáng)的過去了.
We are already in the process of making 6 connections and the number of simultaneous
這個(gè)問題出現(xiàn)了.點(diǎn)擊鏈接可以看到解決問題和方法.
提升到200的時(shí)候,就出現(xiàn)問題了.壓力曲線很難看.
首先是這個(gè)問題,每次打開的連接數(shù)太小.更改了,還是提升不上去.主要問題卡在數(shù)據(jù)庫(kù).
數(shù)據(jù)庫(kù)拿不到更大的連接數(shù),前端頁(yè)面就卡在數(shù)據(jù)庫(kù)這里,全部卡死了.
基本上一個(gè)下午的反復(fù)配置,實(shí)際上都是無用功了.
于是項(xiàng)目組決定,更改連接方式.打斷連接的最大問題,數(shù)據(jù)和前端頁(yè)面的等待連接.讓失敗的數(shù)據(jù)快速返回失敗,不要卡死后面的連接數(shù)據(jù).不能卡死服務(wù)器.
于是在緊張的2天時(shí)間里,把ssh框架給引入進(jìn)來了.讓spring管理struts2的actioin類.也讓spring解決hibernate的事 務(wù).在配置struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37里, 我吃盡了苦頭,深深的理解了,這些框架沒有根本了解帶來的一些歪路.對(duì)于這些配置,我會(huì)再開一貼說明.因?yàn)榫W(wǎng)上關(guān)于這幾個(gè)加起來的配置文章,大多是相互抄 的,沒有根本的配置起來.或者說配置起來,不可用,老報(bào)錯(cuò)等.
改完了以后,做100的測(cè)試,基本上速度是相當(dāng)?shù)目?完全沒有到測(cè)試的上限.
當(dāng)然,這里也有很多好笑的.
比如我們當(dāng)時(shí)開通了兩臺(tái)服務(wù)器,一臺(tái)是測(cè)試的,一臺(tái)是運(yùn)行的.在同一個(gè)機(jī)房.可是網(wǎng)速好像起不來....
因?yàn)樽?cè)\登錄\到首頁(yè)的話, 這個(gè)首頁(yè)就是2M的大小.100個(gè)并發(fā),那可是200M的下載量.不可忽略網(wǎng)速的問題和硬盤的io問題.
在做100以上的時(shí)候,基本上就把js\css\圖片給取消了,只做 注冊(cè)\登錄\到靜態(tài)的首頁(yè).這個(gè)時(shí)間我們的測(cè)試服務(wù)器上的loadruner出了問題.測(cè)試人員說得重裝. - -!汗過一個(gè).我們沒有那么多時(shí)間等.
于是到生產(chǎn)機(jī)上安裝了loadruner就運(yùn)行起來.雖然這樣會(huì)影響真實(shí)的測(cè)試數(shù)據(jù),不過更可以忽略網(wǎng)絡(luò)一塊的因素,來評(píng)估程序的穩(wěn)定性了.
本機(jī)上,先掛300測(cè)試,很快就出現(xiàn)了
We are already in the process of making 6 connections and the number of simultaneous
這個(gè)錯(cuò)誤,我開到100的,結(jié)果還是報(bào) 要101個(gè)鏈接.
再改大的時(shí)候,就出現(xiàn) Communications link failure? Last packet sent to the server was 0 ms ago.這個(gè)錯(cuò)誤了.
網(wǎng)上很多都是說連接地址從localhost改成127.0.0.1就好了,我看了一下我的鏈接,沒有錯(cuò),沒有問題....
也有的說是tomcat等待時(shí)間太長(zhǎng)
wait_timeout
這個(gè)默認(rèn)是8小時(shí),過了就關(guān)閉了.可是我的是tomcat剛打開,沒有這個(gè)道理的.
再分析,應(yīng)該不是這問題? .
把mysql的最大鏈接數(shù)開大到600.再把proxool的最大鏈接數(shù)開到了500.還留100給其他的程序. - -!
再測(cè)試.....還是沒有通過,發(fā)現(xiàn)很多錯(cuò)誤都是不能打開數(shù)據(jù)庫(kù)連接了.通過mysql admin查看,發(fā)現(xiàn)數(shù)據(jù)庫(kù)的連接數(shù)量根本就沒有上去.說明,不是數(shù)據(jù)庫(kù)鏈接數(shù)問題.
再想想,是不是可能出現(xiàn)連接開始的時(shí)候,打開太小了,所以在測(cè)試的時(shí)候,數(shù)據(jù)庫(kù)打開消耗時(shí)間.在并發(fā)的情況下,還要分內(nèi)存和cpu去處理tomcat事務(wù),這樣響應(yīng)不過來..于是把proxool的最小連接數(shù)開到300
proxool.minimum-connection-count="300"
,把
proxool.prototype-count="50"
數(shù)據(jù)活躍數(shù)改到50
再開300的測(cè)試.通過,沒有問題.
但是,不可能一開始就把數(shù)據(jù)庫(kù)連接開到300吧.認(rèn)真分析一下hibernate的原理.是有數(shù)據(jù)緩存的.而我每一次都是重啟tomcat,再來測(cè)試,相 當(dāng)于把hibernate的數(shù)據(jù)緩存給清掉了.根本就沒有體現(xiàn)出hibernate的優(yōu)勢(shì),在這里反而在注冊(cè)查詢的時(shí)候,降低了整個(gè)系統(tǒng)的性能.
于是,把proxool最小鏈接數(shù)再下調(diào)到100.從100個(gè)并發(fā)測(cè)試.好的,沒有問題.
再調(diào)試到200并發(fā).錯(cuò)了6個(gè),還可以接受.
再調(diào)試到300并發(fā).錯(cuò)了10個(gè),還是可以接受.
再調(diào)試到400并發(fā),沒有錯(cuò)誤.
再調(diào)試到500并發(fā),沒有錯(cuò)誤...
看看數(shù)據(jù)連接數(shù),也上來了.
問題就是出現(xiàn)在這里.
如果你的網(wǎng)站,一上來,并發(fā)量就很大的話,那你一定要把最小鏈接數(shù)和保持?jǐn)?shù)據(jù)鏈接活躍數(shù)加大.
保證在瞬時(shí)的并發(fā)時(shí),你的服務(wù)器可以處理過來.
如果你的網(wǎng)站訪問量是慢慢起來的話,那這兩個(gè)的初始值都可以設(shè)置小一點(diǎn).
給出大家數(shù)據(jù)庫(kù)的配置. 這個(gè)配置是放在 tomcat/conf/context.xml下的.通過jndi來調(diào)用的.至于為什么要用tomcat來管理.在關(guān)于s2 s2.5? h3.2 里會(huì)分析.
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" factory="org.logicalcobwebs.proxool.ProxoolDataSource" proxool.alias="DBPool" user="root" password="root" delegateProperties="foo=bar" proxool.jndi-name="mysqljndi" proxool.driver-url="jdbc:mysql://127.0.0.1:3306/webgame?characterEncoding=utf-8" proxool.driver-class="com.mysql.jdbc.Driver" proxool.house-keeping-sleep-time="40000" proxool.house-keeping-test-sql="SELECT ''" proxool.maximum-connection-count="500" proxool.minimum-connection-count="100" proxool.maximum-connection-lifetime="18000000" proxool.simultaneous-build-throttle="100" proxool.recently-started-threshold="40000" proxool.overload-without-refusal-lifetime="50000" proxool.maximum-active-time="60000" proxool.verbose="true" proxool.trace="true" proxool.fatal-sql-exception="Fatal error" proxool.prototype-count="50" proxool.statistics-log-level="DEBUG" />
?大家有什么建議的,歡迎拍磚.
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
