Tomcat有很多方面,我綜合網上文章和自己的優化過程簡單概括。
一.Tomcat內存優化
Tomcat內存優化主要是對 tomcat 啓動參數優化,我們可以在 tomcat 的啓動腳本 catalina.sh 中設置 java_OPTS 參數。
JAVA_OPTS參數說明
-server 啓用jdk 的 server 版;
-Xms java虛擬機初始化時的最小內存;
-Xmx java虛擬機可使用的最大內存;
-XX: PermSize 內存永久保留區域
-XX:MaxPermSize 內存最大永久保留區域
服務器參數配置
現公司服務器內存一般都可以加到最大2G ,所以可以採取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成後可重啓Tomcat ,通過以下命令進行查看配置是否生效:
首先查看Tomcat 進程號:
sudo lsof -i:80
我們可以看到Tomcat 進程號是 12222 。
查看是否配置生效:
sudo jmap – heap 12222
我們可以看到MaxHeapSize 等參數已經生效。
**
二.Tomcat併發優化
**
1.Tomcat連接相關參數
在Tomcat 配置文件 server.xml 中的
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
minProcessors="100"
maxProcessors="1000"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
2.調整連接器connector的併發處理能力
1>參數說明
maxThreads 客戶請求最大線程數 (面試常問)
minSpareThreads Tomcat初始化時創建的 socket 線程數
maxSpareThreads Tomcat連接器的最大空閒 socket 線程數
enableLookups 若設爲true, 則支持域名解析,可把 ip 地址解析爲主機名
redirectPort 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
acceptAccount 監聽端口隊列最大數,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads )
connectionTimeout 連接超時
minProcessors 服務器創建時的最小處理線程數
maxProcessors 服務器同時最大處理線程數 (面試常問)
URIEncoding URL統一編碼
2>Tomcat中的配置示例
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
3.Tomcat緩存優化
1>參數說明
c ompression 打開壓縮功能
compressionMinSize 啓用壓縮的輸出內容大小,這裏面默認爲2KB
compressableMimeType 壓縮類型
connectionTimeout 定義建立客戶連接超時的時間. 如果爲 -1, 表示不限制建立客戶連接的時間
2>Tomcat中的配置示例
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
4.參考配置
1>舊有的配置
參考網絡對服務器做過如下配置,拿出來分享下:
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="200"
redirectPort="8443"
disableUploadTimeout="true" />
後來發現在訪問量達到3 百萬多的時候出現性能瓶頸。
後來發現在訪問量達到3 百萬多的時候出現性能瓶頸。
2>更改後的配置
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
2>更改後的配置
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
壓力性能測試
Tomcat優化部分我們已經完成,接下來就需要比較一下優化前與優化後的性能對比。
1.Jmeter
Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟件做壓力測試,它最初被設計用於Web應用測試,但後來擴展到其他測試領域。 它可以用於測試靜態和動態資源,例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、數據庫、FTP 服務器, 等等。JMeter 可以用於對服務器、網絡或對象模擬巨大的負載,來自不同壓力類別下測試它們的強度和分析整體性能。另外,JMeter能夠對應用程序做功能/迴歸測試,通過創建帶有斷言的腳本來驗證你的程序返回了你期望的結果。爲了最大限度的靈活性,JMeter允許使用正則表達式創建斷言。
Apache jmeter 可以用於對靜態的和動態的資源(文件,Servlet,Perl腳本,java 對象,數據庫和查詢,FTP服務器等等)的性能進行測試。它可以用於對服務器、網絡或對象模擬繁重的負載來測試它們的強度或分析不同壓力類型下的整體性能。你可以使用它做性能的圖形分析或在大併發負載測試你的服務器/腳本/對象。雲服務器、雲數據庫方案、網絡安全防護優選
Jmeter官網:http://jmeter.apache.org/
1)JMeter的作用
(1)能夠對HTTP和FTP服務器進行壓力和性能測試, 也可以對任何數據庫進行同樣的測試(通過JDBC),Jmeter支持以下服務器協議類型測試:
• Web - HTTP, HTTPS
• SOAP / REST
• FTP
• Database via JDBC
• LDAP
• Message-oriented middleware (MOM) via JMS
• Mail - SMTP(S), POP3(S) and IMAP(S)
• MongoDB (NoSQL)
• Native commands or shell scripts
• TCP
(2)完全的可移植性和100% 純java。
(3)完全 Swing 和輕量組件支持(預編譯的JAR使用 javax.swing.*)包。
(4)完全多線程 框架允許通過多個線程併發取樣和 通過單獨的線程組對不同的功能同時取樣。
(5)精心的GUI設計允許快速操作和更精確的計時。
(6)緩存和離線分析/回放測試結果。
2)JMeter下載地址特性
(1)可鏈接的取樣器允許無限制的測試能力。
(2)各種負載統計表和可鏈接的計時器可供選擇。
(3)數據分析和可視化插件提供了很好的可擴展性以及個性化。
(4)具有提供動態輸入到測試的功能(包括JavaScript)。
(5)支持腳本編程的取樣器(在1.9.2及以上版本支持BeanShell)。
在設計階段,JMeter能夠充當HTTP PROXY(代理)來記錄IE/NETSCAPE的HTTP請求,也可以記錄apache等WebServer的log文件來重現HTTP流量。當這些HTTP客戶端請求被記錄以後,測試運行時可以方便的設置重複次數和併發度(線程數)來產生巨大的流量。JMeter還提供可視化組件以及報表工具把量服務器在不同壓力下的性能展現出來。
相比其他HTTP測試工具,JMeter最主要的特點在於擴展性強。JMeter能夠自動掃描其lib/ext子目錄下.jar文件中的插件,並且將其裝載到內存,讓用戶通過不同的菜單調用。
3)Jmeter使用
使用Jmeter非常簡單,windows下進入bin目錄直接雙擊jmeter.bat文件即可,Linux下類似,需要運行jmeter.sh文件,Jmeter運行後顯示以下界面:
Jmeter使用起來比較簡單,附件是一個簡單的配置,直接導入即可使用。
2.測試條件
Tomcat版本:8.0.33
測試項目:新創建一個web項目也不用實現任何代碼,只需要部署即可以使用,只有一個index.jsp文件。
JDK版本:jdk1.7.0.67
請求方式:POST
循環次數:100,1000
線程數:10,100,1000
總次數:總次數 = 線程數 * 循環次數
CPU:英特爾 第二代酷睿 i5-2450M(雙核)
內存:8GB
附件時Jmeter的配置文件,可以直接導入使用。
3.測試結果
從部分結果來看優化過的Tomcat會比默認性能及併發處理能力上有提高,但至於參數的配置需要結合硬件及操作系統來不斷調整,所以並不會有一個萬能的參數來使用,需要各位不斷的測試不斷更改。
以下是一個簡單的測試結果,循環100次,線程數分別爲10,100,1000:
各位估計已經發現了相同的應用下並不一定某種protocol就一定性能出色,因爲Tomcat中的這個測試項目只有一個index.jsp頁面,在較少線程數訪問情況下BIO反應最快,而當線程數達到1000時NIO2性能最出色,而APR中規中矩,雖然這種測試的侷限性很大,但也可以反映出:想要找出適合的配置及最佳性能需要結合實際,不斷的測試與改進,最終才能達到一個相對穩定的性能,雖然此時的性能未必是最佳的,但卻是能應對絕大多數情況的。
總結:感謝網友的文章,此文多數來源於網友的解答。