Tomcat之性能優化

Tomcat是一款Java應用,那麼的配置便與其運行性能密切相關,而優化的重點則集中在內存分配和GC策略的調整上,因爲內存會直接影服務的運行效率和吞吐量,JVM垃圾回收機制則會不同程度的導致程序運行中斷。可以據應用程序的特點,選擇不同的垃圾回收策略,調整JVM垃圾回收策略,可以極大減少垃圾回收次數,提升垃圾回收效率,改善程序運行性能。

優化大綱

  • JVM參數優化
  • Tomcat配置優化

JVM參數優化

內存優化

Linux下修改TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在CLASSPATH=下面:

JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"  

windows下修改TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在set CLASSPATH=下面:

set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m  

-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】

我們可以隨意調整參數來調整tomcat內存以及JVM其他配置,來保證Tomcat的優化。 

Tomcat配置優化

1. 禁用AJP協議

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

      (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. 啓用外部連接池,來滿足高併發已經複用的請求

    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. 優化連接器

  最佳實踐:  

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="800" minSpareThreads="100" />
<Connector  executor="tomcatThreadPool" port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
            connectionTimeout="20000"
            redirectPort="8443" 
            enableLookups="false"
            maxPostSize="10485760"
            URIEncoding="UTF-8" 
            useBodyEncodingForURI="true"
            acceptCount="100"
            acceptorThreadCount="2"
            disableUploadTimeout="true" 
            maxConnections="10000"
            SSLEnabled="false"
    />

5.啓用APR插件

Tomcat可以使用APR來提供超強的可伸縮性和性能,更好地集成本地服務器技術。

APR(Apache Portable Runtime)是一個高可移植庫,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括訪問高級IO功能(例如sendfile,epoll和OpenSSL),OS級別功能(隨機數生成,系統狀態等等),本地進程管理(共享內存,NT管道和UNIX sockets)。這些功能可以使Tomcat作爲一個通常的前臺WEB服務器,能更好地和其它本地web技術集成,總體上讓Java更有效率作爲一個高性能web服務器平臺而不是簡單作爲後臺容器。

在生產環境中,特別是直接使用Tomcat做WEB服務器的時候,應該使用Tomcat Native來提高其性能  要測APR給tomcat帶來的好處最好的方法是在慢速網絡上(模擬Internet),將Tomcat線程數開到300以上的水平,然後模擬一大堆併發請求。如果不配APR,基本上300個線程狠快就會用滿,以後的請求就只好等待。但是配上APR之後,併發的線程數量明顯下降,從原來的300可能會馬上下降到只有幾十,新的請求會毫無阻塞的進來。在局域網環境測,就算是400個併發,也是一瞬間就處理/傳輸完畢,但是在真實的Internet環境下,頁面處理時間只佔0.1%都不到,絕大部分時間都用來頁面傳輸。如果不用APR,一個線程同一時間只能處理一個用戶,勢必會造成阻塞。所以生產環境下用apr是非常必要的。

使用 Undertow 來替代Tomcat 作爲Web容器。Undertow 是 Red Hat 公司的開源產品, 它完全採用 Java 語言開發,是一款靈活的高性能 Web 服務器,支持阻塞 IO 和非阻塞 IO。由於 Undertow 採用 Java 語言開發,可以直接嵌入到 Java 項目中使用。同時, Undertow 完全支持 Servlet 和 Web Socket,在高併發情況下表現非常出色。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章