Tomcat性能優化總結


層級優化!(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">
---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM