1. 程式人生 > >生產環境tomcat引數設定建議

生產環境tomcat引數設定建議

tomcat預設的引數配置是為開發環境定製的,所以記憶體和執行緒的配置都很低,如果直接應用在生產環境,很容易造成效能瓶頸;以下分別從JVM、執行緒池以及連線引數方面給出優化建議:

1. JVM 優化:

  • 當記憶體為8G時,建議配置:

    JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

  • 當記憶體為16G時,建議配置:

      JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

  • 當記憶體為32G時,建議配置:

     JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

引數解釋:

  • -Dfile.encoding:預設檔案編碼
  • -server:表示這是應用於伺服器的配置,JVM內部會有特殊處理(GC策略,記憶體分配策略、以及併發處理能力等)
  • -Xmx1024m:設定JVM最大可用記憶體為1024MB
  • -Xms1024m:設定JVM最小記憶體為1024MB.此值可用設定與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體。
  • -XX:NewSize:設定年輕代大小
  • -XX:MaxNewSize:設定最大年輕代大小
  • -XX:PermSize:設定永久代大小,預設是實體記憶體的1/64
  • -XX:MaxPermSize:設定最大永久代大小,預設實體記憶體的
    1/4(如果有大檔案匯出時,一定要設定該值和-XX:PermSize
  • -XX:NewRatio=4:設定年輕代(包括Eden和兩個Survivor區)與終身代的比值(除去永久代)。設定為4,則年輕代與終身代所佔比值為14,年輕代佔整個堆疊的1/5
  • -XX:MaxTenuringThreshold=10:設定垃圾最大年齡,預設為:15。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件在年輕代的存活時間,增加在年輕代被回收的概率。
  • -XX:+DisableExplicitGC:這個將會忽略手動呼叫GC的程式碼,使得System.gc()的呼叫無效,完全不會觸發任何GC

2. 執行緒池配置

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" prestarminSpareThreads="true" maxQueueSize="100" />

引數解釋:

  • maxThreads:最大併發數,預設值200,一般建議在500~800,根據硬體設施和業務來判斷。
  • minSpareThreadsTomcat初始化時建立的執行緒數,預設為25
  • prestarminSpareThreads:在Tomcat初始化的時候就初始化minSpareThreads的引數值,如果不等於trueminSpareThreads的值就沒啥效果了
  • maxQueueSize:最大的等待佇列數,超過則拒絕請求

3. 修改連線引數

<Connector exexutor="tomcatThreadPool" port="8080" protocol="prg.apache.coyote.http11.http11Nio2Protocol"connectionTimeout="20000" maxConnections="10000"   redirectPort="8443" enableLookups="false" acceptCount="100" maxPostSize="10485760" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" YRIEncoding="utf-8" />

引數解釋:

  • protocolTomcat67設定為nio更好:org.apache.coyote.http11.http11NioProtocolTomcat8nio為:org.apache.coyote.http11.http11Nio2Protocol
  • enableLookups:禁用DNS查詢
  • acceptCount:指定當所有可用處理請求的執行緒數都被使用時,可以放入處理佇列中的請求數,超過這個數的請求將不被吹,預設設定100
  • maxPostSize:以FORM URL引數方式的POST提交方式,限制提交最大的大小,預設為20971522M),它使用的單位是位元組。如果要禁用限制,則可用設定為-1.
  • acceptorThreadCount:接受連線的執行緒數量,預設為1.一般這個值需要改動的時候是因為該伺服器是一個多核CPU,如果是多核CPU一般配置為2.

4.1 生產配置

  • 機器配置:虛機  4C4G
  • 記憶體配置:JAVA_OPTS="-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -server -Xms3072m -Xmx3072m -XX:PermSize=512m -XX:MaxNewSize=512m -XX:MaxPermSize=512m"
  • 連線引數:

<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" compression="on" compressionMinSize1="2048" disableUploadTimeout="true" maxThreads="1024" minSpareThreads="64" maxSpareThreads="128" maxHttpHeaderSize="8192" enableLookups="false" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream" />

4.2 測試結果

併發條件

吞吐量

每秒請求數

每秒請求數(acceptorThreadCount="4")

10

1572

594.37

762.06

20

1455

768.61

1382.87

30

4761

785.67

1310.27

40

5000

1510.19

1724.18

50

5807

1639.50

2025.41

100

6962.8

1680.91

1999.36

200

6054

1061.28

1857.65 

300

6827

979.14

1553.41

400

4198

1055.51 

1879.25

500

6460

734.67

1975.80

1000

4886

734.91

902.59

從測試結果分析連線引數增加:acceptorThreadCount="4"(接受連線的執行緒數量,預設為1.一般這個值需要改動的時候是因為該伺服器是一個多核CPU,如果是多核CPU一般配置為2.  能夠增加伺服器每秒處理的請求數量;建議生產環境加上該引數。