生產環境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:設定最大永久代大小,預設實體記憶體的
- -XX:NewRatio=4:設定年輕代(包括Eden和兩個Survivor區)與終身代的比值(除去永久代)。設定為4,則年輕代與終身代所佔比值為1:4,年輕代佔整個堆疊的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,根據硬體設施和業務來判斷。
- minSpareThreads:Tomcat初始化時建立的執行緒數,預設為25
- prestarminSpareThreads:在Tomcat初始化的時候就初始化minSpareThreads的引數值,如果不等於true,minSpareThreads的值就沒啥效果了
- 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" />
引數解釋:
- protocol:Tomcat6、7設定為nio更好:org.apache.coyote.http11.http11NioProtocol,Tomcat8的nio為:org.apache.coyote.http11.http11Nio2Protocol
- enableLookups:禁用DNS查詢
- acceptCount:指定當所有可用處理請求的執行緒數都被使用時,可以放入處理佇列中的請求數,超過這個數的請求將不被吹,預設設定100
- maxPostSize:以FORM URL引數方式的POST提交方式,限制提交最大的大小,預設為2097152(2M),它使用的單位是位元組。如果要禁用限制,則可用設定為-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.) 能夠增加伺服器每秒處理的請求數量;建議生產環境加上該引數。