OS: Ubuntu14.04 64位 (運行在Docker1.9)javascript
CPU: Intel i3 雙核四線程css
Mem: 8Ghtml
Tomcat版本: Tomcat8.5java
Java SDK版本: JDK 8linux
測試軟件: Apache JMeter 2.8apache
測試代碼爲接受一個http請求,返回一個String變量s.
該變量初始化爲」」, 循環10000次,每次添加內容」test\n」tomcat
public class Test extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{ StringBuffer ret = new StringBuffer(); for(int i=0;i < 10000; i++) { ret.append(String.valueOf(i) + " test\n"); } PrintWriter printWriter = response.getWriter(); printWriter.println(ret); } }
採用JMeter模擬5000個(用戶),在10s內對該接口不斷髮起Get請求,並循環10次.安全
最後統計結果.網絡
對每一個配置的修改都會關閉並重啓tomcat併發
Windows下爲catalina.bat
添加參數:
export JAVA_OPTS=」-server」
測試結果:
修改前:
修改後:
添加參數:
export JAVA_OPTS=」-server -Xms256M -Xmx256M」
做用:Xms參數表示初始堆的大小,也是堆大小的最小值,默認值是總共的物理內存1/64, 且小於1G(下面是-Xmx同), Xmx參數表示堆的最大值.在本機中這個參數的值大約爲128m.這裏將其擴大一倍.正常狀況下應當將這個參數的數值設置爲相同.還有另一些參數,如Xss,表示每一個線程的棧內存,默認爲1M,但通過查閱資料代表這些參數通常狀況下不須要改動.即增長堆內存是提升tomcat內存性能最好最安全的作法.
測試結果:
添加參數:
export JAVA_OPTS=」-server -Xms512M -Xmx512M」
測試結果:
添加參數:
export JAVA_OPTS=」-server -Xms512M -Xmx512M -XX:+AggressiveOpts」
添加參數:
export JAVA_OPTS=」-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking」
做用: 啓用一個優化的線程鎖.對於tomcat來講,每一個http請求都會啓用線程,啓動該線程鎖可讓tomcat對線程進行最優調配.
測試結果:
添加參數:
export JAVA_OPTS=」-server -Xms512M -Xmx512M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC」
在server.xml內定位到標籤,如下的內容均值在該標籤中修改內容
添加參數:
URIEncoding=」UTF-8」
添加參數
protocol=」org.apache.coyote.http11.Http11Nio2Protocol」
若tomcat爲8可改成上面的參數,若爲tomcat6建議改成」org.apache.coyote.http11.Http11NioProtocol」
添加參數
enableLookups=」false」
- 關閉DNS查詢.
添加參數
acceptCount=」1000」
- 指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100.這裏設置爲1000
添加參數
maxThreads=」5000」
- 最大併發數,默認設置 200,這裏設置爲JMeter中的模擬請求數5000
測試結果:
將上述幾個參數添加去本機的配置文件中,測試數據沒有明顯差距,故不貼出.
可能由於測試用例簡單,在這方面進行優化有點殺雞焉用牛刀了.
在本測試中,堆內存的更改對tomcat的優化效果很是明顯.其實這是屬於JVM優化的範疇,只不過做用於tomcat身上.
其餘參數的優化在本測試中效果不明顯,但我相信對於業務複雜的場景,這些優化都是很是必要的,尤爲是對server.xml的優化.
另外,測試過程當中出現讓我很費解的事.相同的配置運行屢次,獲得的數據會有較大的出入.好比我晚上測試了一邊.次日起來用該配置再測一邊,獲得的數據會同比波動會很是大.
結合屢次實驗,發現數據的波動會出如今物理機和Docker容器的喚醒,從新打開JMeter軟件等行爲以後,這些行爲都會致使內存使用率的大量變化,這些都致使JVM的運行環境不夠穩定,
因此,該測試的結果並不嚴謹,僅可做爲參考而不可盡信.務必在您的環境親自測試一遍.
最後,下面給出一份參考配置,轉載自網絡,本文也參考了他們的博文.
catalina.sh
export JAVA_OPTS=」-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true 「
server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" enableLookups="false" acceptCount="100" maxThreads="200" minSpareThreads="10" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" URIEncoding="utf-8" />