struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37 +win2003
hibernate沒有做任何優化,就是默認的讓srping2.5來管理事務的.
做了一個注冊登錄的項目.這個項目是從第三方傳用戶數據和驗證簽名過來,我必須要判斷用戶過來以后,數據沒有被修改,并且數據庫里沒有數據,才可以注冊.
因為要用到大壓力并發,所以做了很多壓力測試,現在和大家分享一下.
在首先,我們并不有馬上做數據庫訪問,注冊等方面的壓力測試,而是先準備把靜態頁面壓力測試到1000以上.
也就是把Tomcat配置好,讓它能處理這么大的并發頁面.
具體可以見我下面的文章:
hi.baidu.com/%CD%F5%D7%D36%BA%C5/blog/item/ff0f9724ff375f21d4074237.html
并發壓力測試到1000,很快就到了.具體配置在文章里有寫到.
接下來,就是做注冊登錄頁面了.具體的流程是這樣的.
在第一次是用的proxool數據連接池.
在100的并發的時候,是很勉強的過去了.
We are already in the process of making 6 connections and the number of simultaneous
這個問題出現了.點擊鏈接可以看到解決問題和方法.
提升到200的時候,就出現問題了.壓力曲線很難看.
首先是這個問題,每次打開的連接數太小.更改了,還是提升不上去.主要問題卡在數據庫.
數據庫拿不到更大的連接數,前端頁面就卡在數據庫這里,全部卡死了.
基本上一個下午的反復配置,實際上都是無用功了.
于是項目組決定,更改連接方式.打斷連接的最大問題,數據和前端頁面的等待連接.讓失敗的數據快速返回失敗,不要卡死后面的連接數據.不能卡死服務器.
于是在緊張的2天時間里,把ssh框架給引入進來了.讓spring管理struts2的actioin類.也讓spring解決hibernate的事 務.在配置struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37里, 我吃盡了苦頭,深深的理解了,這些框架沒有根本了解帶來的一些歪路.對于這些配置,我會再開一貼說明.因為網上關于這幾個加起來的配置文章,大多是相互抄 的,沒有根本的配置起來.或者說配置起來,不可用,老報錯等.
改完了以后,做100的測試,基本上速度是相當的快.完全沒有到測試的上限.
當然,這里也有很多好笑的.
比如我們當時開通了兩臺服務器,一臺是測試的,一臺是運行的.在同一個機房.可是網速好像起不來....
因為注冊\登錄\到首頁的話, 這個首頁就是2M的大小.100個并發,那可是200M的下載量.不可忽略網速的問題和硬盤的io問題.
在做100以上的時候,基本上就把js\css\圖片給取消了,只做 注冊\登錄\到靜態的首頁.這個時間我們的測試服務器上的loadruner出了問題.測試人員說得重裝. - -!汗過一個.我們沒有那么多時間等.
于是到生產機上安裝了loadruner就運行起來.雖然這樣會影響真實的測試數據,不過更可以忽略網絡一塊的因素,來評估程序的穩定性了.
本機上,先掛300測試,很快就出現了
We are already in the process of making 6 connections and the number of simultaneous
這個錯誤,我開到100的,結果還是報 要101個鏈接.
再改大的時候,就出現 Communications link failure? Last packet sent to the server was 0 ms ago.這個錯誤了.
網上很多都是說連接地址從localhost改成127.0.0.1就好了,我看了一下我的鏈接,沒有錯,沒有問題....
也有的說是tomcat等待時間太長
wait_timeout
這個默認是8小時,過了就關閉了.可是我的是tomcat剛打開,沒有這個道理的.
再分析,應該不是這問題? .
把mysql的最大鏈接數開大到600.再把proxool的最大鏈接數開到了500.還留100給其他的程序. - -!
再測試.....還是沒有通過,發現很多錯誤都是不能打開數據庫連接了.通過mysql admin查看,發現數據庫的連接數量根本就沒有上去.說明,不是數據庫鏈接數問題.
再想想,是不是可能出現連接開始的時候,打開太小了,所以在測試的時候,數據庫打開消耗時間.在并發的情況下,還要分內存和cpu去處理tomcat事務,這樣響應不過來..于是把proxool的最小連接數開到300
proxool.minimum-connection-count="300"
,把
proxool.prototype-count="50"
數據活躍數改到50
再開300的測試.通過,沒有問題.
但是,不可能一開始就把數據庫連接開到300吧.認真分析一下hibernate的原理.是有數據緩存的.而我每一次都是重啟tomcat,再來測試,相 當于把hibernate的數據緩存給清掉了.根本就沒有體現出hibernate的優勢,在這里反而在注冊查詢的時候,降低了整個系統的性能.
于是,把proxool最小鏈接數再下調到100.從100個并發測試.好的,沒有問題.
再調試到200并發.錯了6個,還可以接受.
再調試到300并發.錯了10個,還是可以接受.
再調試到400并發,沒有錯誤.
再調試到500并發,沒有錯誤...
看看數據連接數,也上來了.
問題就是出現在這里.
如果你的網站,一上來,并發量就很大的話,那你一定要把最小鏈接數和保持數據鏈接活躍數加大.
保證在瞬時的并發時,你的服務器可以處理過來.
如果你的網站訪問量是慢慢起來的話,那這兩個的初始值都可以設置小一點.
給出大家數據庫的配置. 這個配置是放在 tomcat/conf/context.xml下的.通過jndi來調用的.至于為什么要用tomcat來管理.在關于s2 s2.5? h3.2 里會分析.
<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" />
?大家有什么建議的,歡迎拍磚.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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