層級優化!(JAVA_OPTS參數和主要元素的優化)
Tomcat大致元素架構:server--->service-->Engine-->Host-->Context
Tomcat有可以使用三種協議:HTTP,AJP,HTTPS
tomcat默認采用的BIO模型
tomcat的運行模式有3種:bio,nio,apr(額外安裝),例如:
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
Tomcat各個元素里面都有listener監聽器,由Service層的連接器connector通過線程池(Thread Pool)調用執行器(Executor),Connector的作用是接收連接請求,創建Request和Response對象用於和請求端交換數據;然后分配線程攜帶該request和response交給綁定的Engine來處理,最后把處理后的Request和Response返回給客戶端。
tomcat在啟動時,會將web項目中WEB-INF/web.xml和自己的conf/web.xml進行合並,然后在ContextConfig類下的configureContext()統一解析這些內容
所以,不必要的配置要刪除,以減少Tomcat解析成本。
像在conf/web.xml的DefaultServlet或JspServlet,jspmap,mime,歡迎頁面按需來配置。
在conf/server.xml的Listener監聽器中,VersionLoggerListener作用是顯示版本和JDK環境,可以刪除;AprLifecycleListener作用:加載APR庫使用,這個配置僅當connector的protocol設置為AJP/1.3時有用,如果非AJP/1.3,可以刪除。
GlobalResourcesLifecycleListener作用於全局資源
GlobalNamingResources可以定義全局資源,可以看出,這個tomcat的默認配置是通過讀取$TOMCAT_HOME/ conf/tomcat-users.xml實現的。tomcat-user.xml用於定義tomcat管理頁面相關配置,如果不登錄管理界面可以刪掉。
當tomcat需要集成到Apache服務器時才使用這個<connector protocol=”AJP/1.3”/>
Server元素的port監聽關閉服務的請求
Connector
port:指定服務器端要創建的端口號,並在這個斷口監聽來自客戶端的請求
minProcessors:服務器啟動時創建的處理請求的線程數
maxProcessors:最大可以創建的處理請求的線程數
enableLookups:如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
redirectPort:指定服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
maxConnections:達到這個值之后,將繼續接受連接,但是不處理,能繼續接受多少根據acceptCount的值
minSpareThreads:最小空閑線程數
connectionTimeout:指定超時的時間數(以毫秒為單位)
tomcat默認連接池有限制,可以為connector配置自己的連接池,例如:
<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"
jvm參數優化
tomcat是用Java寫的,就要運行在jvm上,垃圾處理方式等都要遵循jvm的方式。tomcat中設置jvm參數在 catalina.sh(Linux)和catalina.bat(windows)中,以JAVA_OPTS變量存儲。
各參數詳解:
-Xms:設置JVM初始內存大小(默認是物理內存的1/64)
-Xmx:設置JVM可以使用的最大內存(默認是物理內存的1/4,建議:物理內存80%)
-Xmn:設置JVM最小內存(128-256m就夠了,一般不設置)
-XX:PermSize :為JVM啟動時Perm的內存大小
-XX:MaxPermSize :為最大可占用的Perm內存大小(默認為32M)
-XX:MaxNewSize,默認為16M
-XX:NewSize :默認為2M,此值設大可調大新對象區,減少Full
GC次數
-XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認為8)
-XX:SurvivorRatio :改變Eden對象空間和殘存空間的尺寸比例,意思是Eden對象空
間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)
-XX:userParNewGC 可用來設置並行收集【多CPU】
-XX:ParallelGCThreads 可用來增加並行度【多CPU】
-XXUseParallelGC 設置后可以使用並行清除收集器【多CPU】
1. conf/server.xml中Executor對應的相關參數
<!--連接池設置-->
<Executor
name="tomcatThreadPool" --線程池名
namePrefix="catalina-exec-" --線程名稱前綴 namePrefix+threaNumber
maxThreads="1000" --池中最大線程數
minSpareThreads="100" --活躍線程數 會一直存在
maxIdleTime="60000" --線程空閑時間,超過該時間,線程會被銷毀 ms
maxQueueSize="Integer.MAX_VALUE" --被執行前線程的排隊數目
prestartminSpareThreads="false" --啟動線程池時,是否啟用minSpareThreads部分線程
threadPriority="5" --線程池中線程優先級 1~10
className="org.apache.catalina.core.StandardThreadExecutor" --線程實現類 自定義線程需時間 org.apache.catalina.Executor類
/>
<!--當配置了連接池時,需要配置該連接器-->
<Connector
executor="tomcatThreadPool" --線程池名
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
2.conf/server.xml中Connector對應的相關參數
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol" --協議類型
disableUploadTimeout="true"
keepAliveTimeout="20000"
connectionTimeout="20000" --已接受,但未被處理的請求的等待超時時間 ms
redirectPort="8443" --安全通信的轉發端口
URIEncoding="UTF-8"--URL編碼字符集
minSpareThreads="100" --默認初始化和保持空閑的線程數
enableLookups="false"--關閉DNS反向查詢
useURIValidationHack="false" --關閉不必要的檢查
maxThreads="1000" --處理請求線程的最大數目 未配置為200 此屬性會被忽略
acceptCount="1000" --所用可能的線程都在使用時傳入連接請求的最大長度
disableUploadTimeout="true" --設置允許更長的超時連接
maxConnections="1000"--接受和處理的最大連接數(nio/nio2 1000,apr 8192)
maxHttpHeaderSize="8192"--請求和響應http頭的最大大小 8k
tcpNoDelay="true" --tcp不延遲
compression="on"--是否啟用壓縮 on off force
compressionMinSize="2048" --壓縮前數據最小值 2k byte
noCompressionUserAgents="gozilla,traviata" --設置哪些瀏覽器不壓縮
compressableMimeType="text/html,text/xml,text/css,application/javascript,text/plain" --設置壓縮的文件類型
/>
3. 有關 JAVA_OPTS
set JAVA_OPTS=
-server
-Xms1000M
-Xmx1000M #-Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致性能大起大落
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true
4. 禁用8005端口
telnet localhost 8005 然后輸入 SHUTDOWN 就可以關閉 Tomcat,為了安全我們要禁用該功能
默認值:
<Server port="8005" shutdown="SHUTDOWN">
修改為:
<Server port="-1" shutdown="SHUTDOWN">
---------------------