Tomcat 優化

1. 配置優化

1.1. server.xml 配置

[root@localhost ~]# cat server.xml
......
<Connector port="8080"   
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"            # 設置 HTTP 頭部大小
maxThreads="5000"                   # 指定可創建的最大線程數, 默認值爲 200
minSpareThreads="30"                # 指定最小空閒線程數, 默認值是 25
maxSpareThreads="300"               # 指定最大空閒線程數
maxIdleTime="60000"                 # 指定線程最大空閒時間, 單位毫秒
minProcessors="30"                  # 服務器創建時的最小處理線程數
maxProcessors="5000"                # 服務器同時最大處理線程數 
enableLookups="false"               # 關閉主機名反解, 值爲 true 或 false; true 返回主機名, false 返回 IP 地址
URIEncoding="utf-8"                 # 設置 URL 編碼
acceptCount="5000"                  # 監聽端口隊列最大數(不能小於 maxSpareThreads) 
redirectPort="8443"                 # 在需要基於安全通道的場合, 把客戶請求轉發到基於 SSL 的端口 
disableUploadTimeout="false"        # 指定上傳時是否使用超時機制, 值爲 true 或 false
compression="on"                    # 指定是否對響應的數據進行 GZIP 壓縮, on 允許壓縮(文本壓縮), off 禁止壓縮, force 所有情況都進行壓縮, 默認值爲 off
compressionMinSize="2048"           # 指定壓縮響應的最小值, 響應報文大小大於該值對報文進行壓縮, 默認值爲 2048
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"       # 壓縮類型
noCompressionUserAgents="gozilla,traviata"                                          # 指定對以下的瀏覽器不啓用壓縮
connnectionTimeout="30000"          # 指定網絡連接超時時間, 0 表示永不超時, 單位毫秒
connectionUploadTimeout="150000"    # 指定上傳超時時間, 單位毫秒
keepAliveTimeout="120000"           # 指定長連接最大保持時間, 默認使用 connectionTimeout 時間, -1 表示不限制超時, 單位毫秒
maxKeepAliveRequests="1"            # 最大長連接個數, 1 表示禁用長連接, -1 表示不限制長連接個數, 默認運行保持 100 長連接
connectionTimeout="5000" />         # 客戶連接超時的時間, 如果爲 -1 表示不限制建立客戶連接的時間, 單位毫秒

1.2. Tomcat IO 優化

Tomcat 連接器的三種方式: bio、nio 和 apr, apr 性能最優, bio 性能最差
BIO: 同步並阻塞, 服務器實現模式爲一個連接一個線程(默認的工作模式)

# NIO 的工作模式
NIO: 同步非阻塞(JDK1.4 以上版本)

<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" 
enableLookups="false"
redirectPort="8443" />

# APR 的工作模式
APR: 從操作系統級別來解決異步的 IO 問題, 大幅度的提高性能, JDK7 開始支持, 需要安裝官方的插件才能使用
http://tomcat.apache.org/native-doc/    # 插件下載
yum -y install tomcat-native            # 或者使用 yum 安裝, 在 epel 中

<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8" 
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443" />

1.3. context.xml

[root@localhost ~]# cat context.xml
# 設置上下文最大可用緩存
<Resources cachingAllowed="true" cacheMaxSize="100000" />

cachingAllowed  指定允許開啓緩存
cacheMaxSize    指定最大可用緩存, 默認 10M, 單位 KB

1.4. catalina.properties

[root@localhost ~]# cat catalina.properties
# 禁用 TLDs 掃描
tomcat.util.scan.StandardJarScanFilter.jarsToSkip = ****

2. JVM 優化

JVM 優化主要修改 catalina.sh 腳本里面 JAVA_OPTSCATALINA_OPTS 的參數
JAVA_OPTS: 設置 JVM 相關運行參數的變量,用於Java運行時選項start, stoprun 命令執行
CATALINA_OPTS: 設置 Tomcat 相關運行參數的變量, 用於 Java 運行時選項 start, run 命令執行

JVM 內存劃分分爲新生代(Young Generation)老年代(Old Generation)永久代(Permanent Generation)
堆內存(Heap) = 新生代 + 老年代, 非堆內存 = 永久代

CATALINA_OPTS="
${CATALINA_OPTS} 
-server 
-Xms6000M 
-Xmx6000M 
-Xss512k 
-XX:NewSize=2250M 
-XX:MaxNewSize=2250M 
-XX:+AggressiveOpts 
-XX:+UseBiasedLocking 
-XX:+DisableExplicitGC 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:MaxTenuringThreshold=15 
-XX:+CMSParallelRemarkEnabled 
-XX:LargePageSizeInBytes=128M 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-Duser.timezone=Asia/Shanghai 
-Djava.awt.headless=true
-Dfile.encoding=UTF8 
-Dsun.jnu.encoding=UTF8
"

-server                                 啓動速度慢, 運行時性能和內存管理效率高
-clien                                  啓動速度快, 運行時性能和內存管理效率低
-Xms                                    指定 Java 初始化堆大小, -Xms 與 -Xmx 設成一樣的值, 避免 JVM 反覆重新申請內存, 默認值爲物理內存的 1/64, 空餘堆內存小於 40% 時 JVM 增大堆直到 -Xmx 的最大限制
-Xmx                                    指定 Java 最大堆大小, 最大值設置爲可用內存的最大值的 80%, 空餘堆內存大於 70% 時 JVM 減少堆直到 -Xms 的最小限制
-Xss                                    指定每個 Java 線程堆棧大小, 每個線程堆棧大小爲 1M, 線程大小不建議超過 1M
-XX:NewSize                             指定新生代內存大小
-XX:MaxNewSize                          指定最大新生代內存大小
-XX:+AggressiveOpts                     指定每當 JDK 版本升級時, JVM 都會使用最新加入的優化技術
-XX:+UseBiasedLocking                   指定優化線程鎖對線程處理自動進行最優調配
-XX:+DisableExplicitGC                  指定程序代碼中不允許顯示調用 System.gc()
-XX:+UseConcMarkSweepGC                 指定老年代爲併發收集(CMS GC), CMS GC在GC次數增多的情況下, 每次GC的響應時間很短(幾毫秒)
-XX:+UseParNewGC                        指定新生代採用多線程並行回收
-XX:MaxTenuringThreshold                指定垃圾最大年齡, 設置爲 0 新生代對象不經過 Survivor 區, 直接進入老年代, 對於老年代比較多的應用(需要大量常駐內存的應用)可以提高效率; 設置爲一個較大值新生代對象會在 Survivor 區進行多次複製, 可以增加對象在新生代的存活時間, 增加在新生代即被回收的概率, 減少 Full GC 的頻率。該參數只有在串行 GC 時纔有效
-XX:+CMSParallelRemarkEnabled           指定使用 UseParNewGC 的情況下, 儘量減少 Mark 的時間
-XX:LargePageSizeInBytes                指定 Java Heap 的分頁頁面大小, 內存頁的大小不可設置過大, 會影響 Perm 的大小
-XX:+UseFastAccessorMethods             指定使用 Get, Set 方法轉成本地代碼, 原始類型的快速優化
-XX:+UseCMSInitiatingOccupancyOnly      指定在 Oldgeneration 在使用了初始化的比例後 Concurrent Collector 啓動收集
-Duser.timezone=Asia/Shanghai           指定時區
-Djava.awt.headless=true                 兼容 Linux/Unix 下圖形報表顯示輸出
-Xmn                                    指定新生代內存大小, 增大新生代後將會減小老年代大小, 對系統性能影響較大, Sun 官方推薦配置爲整個堆的 3/8
-XX:CMSInitiatingOccupancyFraction      當堆滿之後, 並行收集器開始進行垃圾收集, 與 Xmn 關聯使用
-XX:+CMSIncrementalMode                 指定開啓 CMS 收集器增量模式, 增量模式經常暫停 CMS 過程, 對應用程序線程作出完全的讓步
-XX:+UseSerialGC                        指定使用串行收集器, 老年代使用串行收集
-XX:+UseParallelGC                      指定使用並行收集器, 新生代使用並行收集
-XX:+UseParallelOldGC                   指定老年代垃圾收集方式爲並行收集
-XX:ConcGCThreads                       指定併發 CMS 過程運行時的線程數, 如果未設置, JVM 會根據並行收集器中的 -XX:ParallelGCThreads 參數的值來計算出默認的並行 CMS 線程數
-XX:ParallelGCThreads                   指定並行收集器的線程數,建議配置與CPU數目相等
-XX:OldSize                             指定老年代內存大小

設置字符集編碼:
-Dfile.encoding=UTF8 
-Dsun.jnu.encoding=UTF8
-Djavax.servlet.request.encoding=UTF-8
-Djavax.servlet.response.encoding=UTF-8
-Dfile.encoding=UTF-8
-Duser.country=CN
-Duser.language=zh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章