基本常見的幾種調優(yōu)方式:線程,內存,使用Apache+JK+Tomcat配置(負載均衡)等
第一:不使用tomcat線程池
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="800" acceptCount="1000"/>
1:最大連接數:maxThreads
tomcat同時處理的最大線程數量
配置依據:
(1)、部署的程序偏計算型,主要利用cpu資源,應該將該參數設置小一點,減小同一時間搶占cpu資源的線程個數。
(2)、部署的程序對io、數據庫占用時間較長,線程處于等待的時間較長,應該將該參數調大一點,增加處理個數。
應該注意:如果線程數過大,那么cpu用在線程切換的時間占的比重會增大,系統(tǒng)性能會降低。
2、最大排隊數 acceptCount
當tomcat的線程數達到maxThreads后,新的請求就會排隊等待,超過排隊數的請求會被拒絕。
我一般設置和maxThreads相同。
參數的設置需要進行測試,找到一個合理的點。
第二:使用tomcat線程池
首先打開共享的線程池
之所以叫共享線程池,意思是所有的connector都可以共同使用這個線程池
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" maxIdleTime="60000"/>
配置文件中本來就有的,默認前后是注釋掉的,去掉就可以了。
然后connector中指定使用共享線程池
<Connector port="8088" protocol="HTTP/1.1"
connectionTimeout="20000" executor="tomcatThreadPool"
redirectPort="8448" URIEncoding="UTF-8" />
一旦使用了線程池,則其它的線程屬性,比如 maxThreads等將被忽略 。
在運行多個Connector的狀況下,這樣處理非常有用,而且每個Connector必須設置一個maxThread值,但不希望Tomcat實例并發(fā)使用的線程最大數永遠與所有連接器maxThread數量的總和一樣高。
這是因為如果這樣處理,則需要占用太多的硬件資源。相反,您可以使用Executor元素配置一個共享線程池,而且所有的Connector都能共享這個線程池。
警告:為了讓連接器使用Executor的線程池,則在server.xml文件中,Executor必須列示在Connector之前。
下面顯示了Executor的屬性。
屬性:className、含義:Executor實現的完全限定的Java類名、默認值:org.apache.catalina.core.StandardThread-Executor。
屬性:daemon、含義:決定這一Executor的線程是否應該為后臺線程。如果JVM中的所有其他非后臺線程都結束了,則后臺線程結束。
要獲得有關后臺線程的詳細解釋,參見java.lang.Thread的Java 1.5(及更高版本)Javadoc網頁、默認值:false。
屬性:name、含義:共享線程池的名字。這是Connector為了共享線程池要引用的名字。該名字必須唯一、默認值:None;需要的參數。
屬性:namePrefix、含義:在JVM上,每個運行線程都可以有一個name 字符串。這一屬性為線程池中每個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的后面、默認值:tomcat-exec-。
屬性:maxIdleTime、含義:在Tomcat關閉一個空閑線程之前,允許空閑線程持續(xù)的時間(以毫秒為單位)。只有當前活躍的線程數大于minSpareThread的值,才會關閉空閑線程、默認值:60000(一分鐘)。
屬性:maxThreads、含義:該線程池可以容納的最大線程數、默認值:200。
屬性:minSpareThreads、含義:Tomcat應該始終打開的最小不活躍線程數、默認值:25。
屬性:threadPriority、含義:整數值,表示線程池中所有線程的線程優(yōu)先權。
要獲得有關線程優(yōu)先權的詳細解釋,參見java.lang.Thread的Java 1.5(及更高版本)Javadoc網頁、默認值:Thread.NORM_PRIORITY