Tomcat調優測試

測試環境:

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併發

調優方式一 : 修改…/bin/catalina.sh(啓動時優化)

Windows下爲catalina.bat

  • 添加參數:

    export JAVA_OPTS=」-server」

    • 做用:tomcat默認以java –client方式運行, 添加」server」參數將tomcat切換爲生產模式,使得tomcat能支持更高的併發數和吞吐量.
    • 測試結果:

      修改前:

      修改後:

  • 添加參數:

    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」

    • 做用: -XX:+AggressiveOpts表示每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(若是有的話).建議加上,但也要注意若升級JDK版本後系統出現意外狀況,應該對該參數的影響進行測試.
  • 添加參數:

    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」

    • 做用: 禁止顯示調用System.gc().若在代碼中顯示調用System.gc()讓JVM進行垃圾回收,會極大下降系統響應時間.

調優方式二: 更改…/conf/server.xml (容器內優化)

在server.xml內定位到標籤,如下的內容均值在該標籤中修改內容

  • 添加參數:

    URIEncoding=」UTF-8」

    • 做用: 使得tomcat能夠解析含有中文名的文件的url
  • 添加參數

    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配置來源

server.xml配置來源

參考配置

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"
/>
相關文章
相關標籤/搜索