Tomcat7性能優化


  用了很久的Tomcat,沒怎么看過它的優化,今天抽出時間研究了下,將內容記錄下。

首先,是客戶端訪問tomcat的一個過程,如圖所示:

圖中間虛線框部分是 Apache基金下的服務器來做靜態資源處理的,而這部分需要花費大量時間,當用nginx和tomcat做企業級集群的時候,需要禁用掉AJP協議。


一、准備工作:

1. 配置管理員帳戶:

  進入conf目錄下,打開tomcat-users.xml,在首尾元素中間加入:

 <role rolename="manager"/>
  <role rolename="manager-gui"/>
  <role rolename="admin"/>
  <role rolename="admin-gui"/>
  <user username="tomcat"  password="tomcat" roles="admin-gui,admin,manager-gui,manager"/> 

      此時,配置的用戶名和密碼都是tomcat。

2. 優化方法

  (1)在瀏覽器中輸入 http://localhost:8080/,點擊頁面中 Server Status,可以看到默認tomcat中的JVM、HTTP、AJP協議、連接池是否啟用等,可以通過修改頁面上顯

示的參數來優化tomcat。

  (2)在server.xml中進行更加深入的配置。

二、優化

1. 禁用AJP協議

  (1)通過禁用AJP協議,達到在集群的時候提高處理請求的時間。

  圖1

  (2)啟動tomcat后,不論從剛剛的管理員界面,還是從控制台上(如圖1所示)都可以看出,AJP協議是開啟的。

  我們要做的就是要將此協議禁用,禁用方法:在server.xml中,將  

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

  注釋掉,重新啟動tomcat,可以看出控制台上已經不存在上圖 黑框中所示的。

2. 將BIO通訊模式修改為NIO通訊模式

  (1)tomcat通訊協議支持http1.0和1.1,tomcat默認走的是BIO通訊模式,tomcat7和tomcat8之所以默認的都是效率低下的BIO通訊模式,是因為和前面的就項目做兼容。

  (2)在控制台上(如圖1所示)或者管理界面都可以看到,tomcat啟動的通訊模式是bio的。

  (3)應用場景:tomcat集群的時候,若項目比較新,都是1.5類庫之前,即JDK版本大於1.5,可將集群中每一個tomcat的啟動模式設置為高並發高性能的應答模式(NIO)。

  (4)配置方法:在server.xml中 ,將 <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改為:  

<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

  其中,原來的protocol="HTTP/1.1"表示遵循http1.1協議,同時,也是一個最原始的未經優化的通信協議,

  修改之后的 protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式啟動。

3. 啟用外部連接池,來滿足高並發已經復用的請求

  圖2

    maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值為200。將  

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/>

  注釋打開,並修改maxThreads的值,然后在<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

  中加入 executor="tomcatThreadPool",即最后為:  

<Connector connectionTimeout="20000" port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

      根據業務場景和服務器硬件資源條件可以適當的加大線程連接池,根據第三方工具去開啟並發測試來確定一個最好的連接池數。

4. 優化連接器

  最佳實踐:  

<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
            connectionTimeout="20000"
            enableLookups="false"
            maxPostSize="10485760"
            URIEncoding="UTF-8" 
            useBodyEncodingForURI="true"
            acceptCount="100"
            acceptorThreadCount="2"
            disableUploadTimeout="true" 
            maxConnections="10000"
            SSLEnabled="false"
    />

5. 在tomcat中設置JVM參數

  修改bin/catalina.bat文件設置參數(注釋后第一行),增加  

  set JAVA_OPTS=-Dfile.encoding=UTF-8 
  -server 
  -Xms1024m 
  -Xmx2048m 
  -XX:NewSize=512m 
  -XX:MaxNewSize=1024m 
  -XX:PermSize=256m 
  -XX:MaxPerPermSize=356m 
  -XX:NewRatio=2 
  -XX:MaxTenuringThreshold=50 
  -XX:+DisableExplicitGC

   -Xms:設置JVM初始內存大小(默認是物理內存的1/64)

   -Xmx:設置JVM可以使用的最大內存(默認是物理內存的1/4,建議:物理內存80%)

   -Xmn:設置JVM最小內存(128-256m就夠了,一般不設置)

   默認空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、

-Xmx相等以避免在每次GC 后調整堆的大小。  

   在較大型的應用項目中,默認的內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤“java.lang.OutOfMemoryError:Java heap space”,從而

導致客戶端顯示500錯誤。  

  -XX:PermSize :為JVM啟動時Perm的內存大小  

  -XX:MaxPermSize :為最大可占用的Perm內存大小(默認為32M) 

  -XX:MaxNewSize,默認為16M


  PermGen space的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到

PermGenspace中,它和存放類實例(Instance)的Heap區域不同,GC(GarbageCollection)不會在主程序運行期對PermGenspace進行清理,所以如果你的應用中有很CLASS的

話,就很可能出現“java.lang.OutOfMemoryError:PermGen space”錯誤。

對於WEB項目,jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調整永久域大小,為了避免調整),你可以使用更多的參數配置。如果你的WEBAPP下都用了大量的第三

方jar, 其大小超過了jvm默認的大小,那么就會產生此錯誤信息了。


其它參數:

  -XX:NewSize :默認為2M,此值設大可調大新對象區,減少FullGC次數

  -XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認為8)

  -XX:SurvivorRatio :改變Eden對象空間和殘存空間的尺寸比例,意思是Eden對象空間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)

  -XX:userParNewGC 可用來設置並行收集【多CPU】

  -XX:ParallelGCThreads 可用來增加並行度【多CPU】

  -XXUseParallelGC 設置后可以使用並行清除收集器【多CPU】

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM