Tomcat性能調整2
在Tomcat 4.1(或更高版本),JSP的編譯由包含在Tomcat裡面的Ant程序控制器直接執行。這聽起來有一點點奇怪,但這正是Ant有意為之的一部分,有一 個API文檔指導開發者在沒有啟動一個新的JVM的情況下,使用Ant。這是使用Ant進行Java開發的一大優勢。另外,這也意味著你現在能夠在Ant 中使用任何javac支持的編譯方式,這裡有一個關於Apache Ant使用手冊的javac page列表。使用起來是容易的,因為你只需要在 元素中定義一個名字叫「compiler」,並且在value中有一個支持編譯的編譯器名字,示例如下:
jsp
org.apache.jasper.servlet.JspServlet
logVerbosityLevel
WARNING
compiler
jikes
3
Ant可用的編譯器
名稱
別名
調用的編譯器classic
javac1.1, javac1.2
Standard JDK 1.1/1.2 compiler
modern
javac1.3, javac1.4
Standard JDK 1.3/1.4 compiler
jikes
The Jikes compiler
JVC
Microsoft
Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++
KJC
The kopi compiler
GCJ
The gcj compiler (included as part of gcc)
SJ
Symantec
Symantec』s Java compiler
extJavac
Runs either the modern or classic compiler in a JVM of its own
由於JSP頁面在第一次使用時已經被編譯,那麼你可能希望在更新新的jsp頁面后馬上對它進行編譯。實際上,這個過程完全可以自動化,因為可以確認的是新的JSP頁面在生產伺服器和在測試伺服器上的運行效果是一樣的。在Tomcat4的bin目錄下有一個名為jspc的腳本。它僅僅是運行翻譯階段,而不是編譯階段,使用它可以在當前目錄生成Java源文件。它是調試JSP頁面的一種有力的手段。
可以通過瀏覽器訪問再確認一下編譯的結果。這樣就確保了文件被轉換成serverlet,被編譯了可直接執行。這樣也準確地模仿了真實用戶訪問JSP頁面,可以看到給用戶提供的功能。也抓緊這最後一刻修改出現的bug並且修改它J
Tomcat提供了一種通過請求來編譯JSP頁面的功能。例如,你可以在瀏覽器地址欄中輸入http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true,這樣Tomcat就會編譯data.jsp而不是執行它。此舉唾手可得,不失為一種檢驗頁面正確性的捷徑。
4. 其它
前面我們提到過操作系統通過一些限制手段來防止惡意的服務攻擊,同樣Tomcat也提供了防止惡意攻擊或禁止某些機器訪問的設置。
Tomcat提供了兩個參數供你配置:RemoteHostValve 和RemoteAddrValve。
通過配置這兩個參數,可以讓你過濾來自請求的主機或IP地址,並允許或拒絕哪些主機/IP。與之類似的,在Apache的httpd文件里有對每個目錄的允許/拒絕指定。
例如你可以把Admin Web application設置成只允許本地訪問,設置如下:
<Valve className=」org.apache.catalina.valves.RemoteAddrValve」
allow=」127.0.0.1″ deny=」"/>
如果沒有給出允許主機的指定,那麼與拒絕主機匹配的主機就會被拒絕,除此之外的都是允許的。與之類似,如果沒有給出拒絕主機的指定,那麼與允許主機匹配的主機就會被允許,除此之外的都是拒絕的。
五. 容量計劃
容量計劃是在生產環境中使用Tomcat不得不提的提高性能的另一個重要的話題。如果你沒有對預期的網路流量下的硬體和帶寬做考慮的話那麼無論你如何做配置修改和測試都無濟於事。
這裡先對提及的容量計劃作一個簡要的定義:容量計劃是指評估硬體、操作系統和網路帶寬,確定應用服務的服務範圍,尋求適合需求和軟體特性的軟硬體的一項活動。因此這裡所說的軟體不僅包括Tomcat,也包括與Tomcat結合使用的任何第三方web伺服器軟體。
如果在購買軟硬體或部署系統前你對容量計劃一無所知,不知道現有的軟硬體環境能夠支撐多少的訪問量,甚至更糟直到你已經交付並且在生產環境上部署產品后才意識到配置有問題時再進行變更可能為時已晚。此時只能增加硬體投入,增加硬碟容量甚至購買更好的伺服器。如果事先做了容量計劃那麼就不會搞的如此焦頭爛額了。
我們這裡只介紹與Tomcat相關的內容。
首先為了確定Tomcat使用機器的容量計劃,你應該從一下列表項目種著手研究和計劃:
1. 硬體
採用什麼樣的硬體體系?需要多少台計算機?使用一個大型的,還是使用多台小型機?每個計算機上使用幾個CPU?使用多少內存?使用什麼樣的存儲設備, I/O的處理速度有什麼要求?怎樣維護這些計算機?不同的JVM在這些硬體上運行的效果如何(比如IBM AIX系統只能在其設計的硬體系統上運行)?
2. 網路帶寬
帶寬的使用極限是多少?web應用程序如何處理過多的請求?
3. 服務端操作系統
採用哪種操作系統作為站點伺服器最好?在確定的操作系統上使用哪個JVM最好?例如,JVM在這種系統上是否支持本地多線程,對稱多處理?哪種系統可使web伺服器更快、更穩定,並且更便宜。是否支持多CPU? 4. Tomcat容量計劃
以下介紹針對Tomcat做容量計劃的步驟:
1) 量化負載。如果站點已經建立並運行,可以使用前面介紹的工具模仿用戶訪問,確定資源的需求量。
2) 針對測試結果或測試過程中進行分析。需要知道那些請求造成了負載過重或者使用過多的資源,並與其它請求做比較,這樣就確定了系統的瓶頸所在。例如:如果servlet在查詢資料庫的步驟上耗用較長的時間,那麼就需要考慮使用緩衝池來降低響應時間。
3) 確定性能最低標準。例如,你不想讓用戶花20秒來等待結果頁面的返回,也就是說甚至在達到訪問量的極限時,用戶等待的時間也不能超過20秒種(從點擊鏈接到看到返第一條返回數據)。這個時間中包含了資料庫查詢時間和文件訪問時間。同類產品性能在不同的公司可能有不同的標準,一般最好採取同行中的最低標準或對這個標準做出評估。
4) 確定如何合理使用底層資源,並逐一進行測試。底層資源包括CPU、內存、存儲器、帶寬、操作系統、JVM 等等。在各種生產環境上都按順序進行部署和測試,觀察是否符合需求。在測試Tomcat時盡量多採用幾種JVM,並且調整JVM使用內存和Tomcat線 程池的大小進行測試。同時為了達到資源充分合理穩定地使用的效果,還需針對測試過程中出現的硬體系統瓶頸進行處理確定合理的資源配置。這個過程最為複雜, 而且一般由於沒有可參考的值所以只能靠理論推斷和經驗總結。
5) 如果通過第4步的反覆測試如果達到了最優的組合,就可以在相同的生產環境上部署產品了。
此外應牢記一定要文檔化你的測試過程和結果,因為此後可能還會進行測試,這樣就可以拿以前的測試結果做為參考。另外測試過程要反覆多次進行,每次的條件可能都不一樣,因此只有記錄下來才能進行結果比較和最佳條件的選擇。
這樣我們通過測試找到了最好的組合方式,各種資源得到了合理的配置,系統的性能得到了極大的提升。
六. 附加資料
很顯然本文也很難全面而詳盡地闡述性能優化過程。如果你進行更多研究的話可能會把性能調優做的更好,比如Java程序的性能調整、操作系統的調整、各種 複雜環境與應用系統和其它所有與應用程序相關的東西。在這裡提供一些文中提到的一些資源、文中提到的相關內容的鏈接以及本文的一些參考資料。
1. Web性能測試資料及工具
1) Jmeter Wiki首頁,Jmeter為一個開源的100%Java開發的性能測試工具
http://wiki.apache.org/jakarta-jmeter/
2) Apache Benchmark使用說明
http://httpd.apache.org/docs-2.0/programs/ab.html
3) 一些Java相關測試工具的介紹,包含可以與Tomcat集成進行測試的工具
http://blog.csdn.net/wyingquan/
4) LoadRunner® 是一種預測系統行為和性能的工業標準級負載測試工具。它通過模擬數據以千萬計用戶來實施併發負載來對整個企業架構進行測試,來幫助您更快的查找和發現問題。
http://www.mercury.com/us/products/performance-center/loadrunner/
2. 文中介紹的相關內容的介紹
1) Apache 2.x + Tomcat 4.x做負載均衡,描述了如何利用jk配置集群的負載均衡。
http://raibledesigns.com/tomcat/index.html
2) 容量計劃的制定,收集了許多有關制定web站點容量計劃的例子:
http://www.capacityplanning.com/
3) 評測Tomcat5負載平衡與集群,
http://www.javaresearch.org/arti ... 56&thread=19777
4) Apache與Tomcat的安裝與整合之整合篇
http://www.javaresearch.org/arti ... 23&thread=18139
5) 性能測試工具之研究,介紹了性能測試工具的原理與思路
http://www.51testing.com/emagzine/No2_2.htm
6) Java的內存泄漏
http://www.matrix.org.cn/resource/article/409.html
7) Web伺服器和應用程序伺服器有什麼區別?
http://www.matrix.org.cn/resource/article/1429.html
8) 詳細講解性能中資料庫集群的問題
http://www.theserverside.com/articles/article.tss?l=DB_Break
《解決方案》
謝謝分享