1. 程式人生 > >簡述效能優化tomcat配置(從記憶體、併發、快取方面)優化及壓力測試

簡述效能優化tomcat配置(從記憶體、併發、快取方面)優化及壓力測試

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中規中矩,雖然這種測試的侷限性很大,但也可以反映出:想要找出適合的配置及最佳效能需要結合實際,不斷的測試與改進,最終才能達到一個相對穩定的效能,雖然此時的效能未必是最佳的,但卻是能應對絕大多數情況的。

        總結:感謝網友的文章,此文多數來源於網友的解答。