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> 單位為分鐘。
Apr外掛程式提高Tomcat效能
Tomcat可以使用APR來提供超強的延展性和效能,更好地整合本機伺服器技術.
APR(Apache Portable Runtime)是一個高可移植庫,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括訪問進階IO功能(例如sendfile,epoll和OpenSSL),OS層級功能(隨機數產生,系統狀態等等),本地進程管理(共用記憶體,NT管道和UNIX sockets)。這些功能可以使Tomcat作為一個通常的前台WEB伺服器,能更好地和其它本地web技術整合,總體上讓Java更有效率作為一個高效能web伺服器平台而不是簡單作為後台容器。
在產品環境中,特別是直接使用Tomcat做WEB伺服器的時候,應該使用Tomcat Native來提高其效能
要測APR給tomcat帶來的好處最好的方法是在慢速網路上(類比Internet),將Tomcat線程數開到300以上的水平,然後類比一大堆並發請求。
如果不配APR,基本上300個線程狠快就會用滿,以後的請求就只好等待。但是配上APR之後,並發的線程數量明顯下降,從原來的300可能會馬上下降到只有幾十,新的請求會毫無阻塞的進來。
在區域網路環境測,就算是400個並發,也是一瞬間就處理/傳輸完畢,但是在真實的Internet環境下,頁面處理時間只佔0.1%都不到,絕大部分時間都用來頁面傳輸。如果不用APR,一個線程同一時間只能處理一個使用者,勢必會造成阻塞。所以生產環境下用apr是非常必要的。
(1)安裝APR tomcat-native apr-1.3.8.tar.gz 安裝在/usr/local/apr #tar zxvf apr-1.3.8.tar.gz #cd apr-1.3.8 #./configure;make;make install apr-util-1.3.9.tar.gz 安裝在/usr/local/apr/lib #tar zxvf apr-util-1.3.9.tar.gz #cd apr-util-1.3.9 #./configure --with-apr=/usr/local/apr ----with-java-home=JDK;make;make install #cd apache-tomcat-6.0.20/bin #tar zxvf tomcat-native.tar.gz #cd tomcat-native/jni/native #./configure --with-apr=/usr/local/apr;make;make install (2)設定 Tomcat 整合 APR 修改 tomcat 的啟動 shell (startup.sh),在該檔案中加入啟動參數: CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib" 。 (3)判斷安裝成功: 如果看到下面的開機記錄,表示成功。 2007-4-26 15:34:32 org.apache.coyote.http11.Http11AprProtocol init
參考 http://blog.sina.com.cn/s/blog_417b97470100glmi.html
http://datadig.blog.163.com/blog/static/171229928201082075946726/