Tomcat性能調優

 來源:Java實踐筆記 Java實踐筆記

Tomcat server.xml connection 調優

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="30000"
           redirectPort="8443" 
           URIEncoding="UTF-8"
           maxThreads="1000" 
           minSpareThreads="50"
           acceptCount="250"
           enableLookups="false"
           maxKeepAliveRequests="1" />
  • URIEncoding:用來解決中文亂碼

  • maxThreads:tomcat最大併發數

  • acceptCount:當同時連接的人數達到maxThreads時,還可以接收排隊的連接數量,超過這個連接的則直接返回拒絕連接。(指定當任何能夠使用的處理請求的線程數都被使用時,能夠放到處理隊列中的請求數,超過這個數的請求將不予處理。默認值100。 ) 
    其中和最大連接數相關的參數爲maxThreads和acceptCount。如果要加大併發連接數,應同時加大這兩個參數。 
    web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。

  • minSpareThreads:tomcat初始化時創建的線程數

  • enableLookups:是否開啓域名反查,設置爲false來提高處理能力

  • maxKeepAliveRequests:nginx動態的轉給tomcat,nginx是不能keepalive的,而tomcat端默認開啓了keepalive,會等待keepalive的timeout,默認不設置就是使用connectionTimeout。 
    所以必須設置tomcat的超時時間,並關閉tomcat的keepalive。否則會產生大量tomcat的socket timewait。 
    maxKeepAliveRequests=”1”就可以避免tomcat產生大量的TIME_WAIT連接,從而從一定程度上避免tomcat假死。

JVM 調優

Tomcat本身還是運行在JVM上的,通過對JVM參數的調整我們可以使Tomcat擁有更好的性能。針對JVM的優化目前主要在兩個方面:

內存調優

內存方式的設置是在catalina.sh中,調整一下JAVA_OPTS變量即可,因爲後面的啓動參數會把JAVA_OPTS作爲JVM的啓動參數來處理。

具體設置如下:

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4" 

其各項參數如下: 
-Xmx3550m:設置JVM最大可用內存爲3550M。 
-Xms3550m:設置JVM促使內存爲3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。 
-Xmn2g:設置年輕代大小爲2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小爲64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。 
-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5 
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6 
-XX:MaxPermSize=16m:設置持久代大小爲16m。 
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置爲0的話,則年輕代對象不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置爲一個較大值,則年輕代對象會在Survivor區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。

通常會在jvm創建虛擬機時指定其以哪種方式啓動:client,server。在windows上默認創建client,在linux默認創建server。可以在JAVA_OPTS中添加-server指定啓動方式。

垃圾回收策略調優

垃圾回收的設置也是在catalina.sh中,調整JAVA_OPTS變量。 
具體設置如下:

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC 
-XX:MaxGCPauseMillis=100"

具體的垃圾回收策略及相應策略的各項參數如下:

串行收集器(JDK1.5以前主要的回收方式) 
-XX:+UseSerialGC:設置串行收集器

並行收集器(吞吐量優先) 
示例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 

-XX:+UseParallelGC:選擇垃圾收集器爲並行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用併發收集,而年老代仍舊使用串行收集。 
-XX:ParallelGCThreads=20:配置並行收集器的線程數,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數目相等。 
-XX:+UseParallelOldGC:配置年老代垃圾收集方式爲並行收集。JDK6.0支持對年老代並行收集 
-XX:MaxGCPauseMillis=100:設置每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。 
-XX:+UseAdaptiveSizePolicy:設置此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直打開。

併發收集器(響應時間優先) 
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC 
-XX:+UseConcMarkSweepGC:設置年老代爲併發收集。測試中配置這個以後,-XX:NewRatio=4的配置失效了,原因不明。所以,此時年輕代大小最好用-Xmn設置。 
-XX:+UseParNewGC: 設置年輕代爲並行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,所以無需再設置此值。 
-XX:CMSFullGCsBeforeCompaction:由於併發收集器不對內存空間進行壓縮、整理,所以運行一段時間以後會產生“碎片”,使得運行效率降低。此值設置運行多少次GC以後對內存空間進行壓縮、整理。 
-XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片

小結

在內存設置中需要做一下權衡 
1)內存越大,一般情況下處理的效率也越高,但同時在做垃圾回收的時候所需要的時間也就越長,在這段時間內的處理效率是必然要受影響的。 
2)在大多數的網絡文章中都推薦 Xmx和Xms設置爲一致,說是避免頻繁的回收,這個在測試的時候沒有看到明顯的效果,內存的佔用情況基本都是鋸齒狀的效果,所以這個還要根據實際情況來定。

發佈了34 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章