tomcat默認參數是爲開發環境制定,而非適合生產環境,尤其是內存和線程的配置,默認都很低,容易成爲性能瓶頸。下面是幾個tomcat參數的調整方案:
tomcat內存優化
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m
最大堆內存是1024m,對於現在的硬件還是偏低,實施時,還是按照機器具體硬件配置優化。
tomcat 線程優化
<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"connectionTimeout="20000" redirectPort="8443" />
maxThreads="600" ///最大線程數
minSpareThreads="100"///初始化時創建的線程數
maxSpareThreads="500"///一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。
acceptCount="700"//指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
這裏是http connector的優化,如果使用apache和tomcat做集羣的負載均衡,並且使用ajp協議做apache和tomcat的協議轉發,那麼還需要優化ajp connector。
<Connector port="8009" protocol="AJP/1.3" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"connectionTimeout="20000" redirectPort="8443" />
由於tomcat有多個connector,所以tomcat線程的配置,又支持多個connector共享一個線程池。
首先。打開/conf/server.xml,增加
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />
最大線程500(一般服務器足以),最小空閒線程數20,線程最大空閒時間60秒。
然後,修改<Connector ...>節點,增加executor屬性,executor設置爲線程池的名字:
<Connector executor="tomcatThreadPool" port="80" protocol="HTTP/1.1" connectionTimeout="60000" keepAliveTimeout="15000" maxKeepAliveRequests="1" redirectPort="443" />
可以多個connector公用1個線程池,所以ajp connector也同樣可以設置使用tomcatThreadPool線程池。
禁用DNS查詢
當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名 轉換爲IP地址。
DNS查詢需要佔用網絡,並且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。
修改server.xml文件中的Connector元素,修改屬性enableLookups參數值: enableLookups="false"
如果爲true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
設置session過期時間
conf\web.xml中通過參數指定:
<session-config> <session-timeout>180</session-timeout> </session-config> 單位爲分鐘。