Tomcat7性能优化
用了很久的Tomcat,沒(méi)怎么看過(guò)它的優(yōu)化,今天抽出時(shí)間研究了下,將內(nèi)容記錄下。
首先,是客戶端訪問(wèn)tomcat的一個(gè)過(guò)程,如圖所示:
圖中間虛線框部分是 Apache基金下的服務(wù)器來(lái)做靜態(tài)資源處理的,而這部分需要花費(fèi)大量時(shí)間,當(dāng)用nginx和tomcat做企業(yè)級(jí)集群的時(shí)候,需要禁用掉AJP協(xié)議。
一、準(zhǔn)備工作:
1. 配置管理員帳戶:
進(jìn)入conf目錄下,打開tomcat-users.xml,在首尾元素中間加入:
<role rolename="manager"/><role rolename="manager-gui"/><role rolename="admin"/><role rolename="admin-gui"/><user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>? ? ? 此時(shí),配置的用戶名和密碼都是tomcat。
2. 優(yōu)化方法
(1)在瀏覽器中輸入?http://localhost:8080/,點(diǎn)擊頁(yè)面中 Server Status,可以看到默認(rèn)tomcat中的JVM、HTTP、AJP協(xié)議、連接池是否啟用等,可以通過(guò)修改頁(yè)面上顯
示的參數(shù)來(lái)優(yōu)化tomcat。
(2)在server.xml中進(jìn)行更加深入的配置。
二、優(yōu)化
1. 禁用AJP協(xié)議
(1)通過(guò)禁用AJP協(xié)議,達(dá)到在集群的時(shí)候提高處理請(qǐng)求的時(shí)間。
圖1
(2)啟動(dòng)tomcat后,不論從剛剛的管理員界面,還是從控制臺(tái)上(如圖1所示)都可以看出,AJP協(xié)議是開啟的。
我們要做的就是要將此協(xié)議禁用,禁用方法:在server.xml中,將
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />注釋掉,重新啟動(dòng)tomcat,可以看出控制臺(tái)上已經(jīng)不存在上圖 黑框中所示的。
2. 將BIO通訊模式修改為NIO通訊模式
(1)tomcat通訊協(xié)議支持http1.0和1.1,tomcat默認(rèn)走的是BIO通訊模式,tomcat7和tomcat8之所以默認(rèn)的都是效率低下的BIO通訊模式,是因?yàn)楹颓懊娴木晚?xiàng)目做兼容。
(2)在控制臺(tái)上(如圖1所示)或者管理界面都可以看到,tomcat啟動(dòng)的通訊模式是bio的。
(3)應(yīng)用場(chǎng)景:tomcat集群的時(shí)候,若項(xiàng)目比較新,都是1.5類庫(kù)之前,即JDK版本大于1.5,可將集群中每一個(gè)tomcat的啟動(dòng)模式設(shè)置為高并發(fā)高性能的應(yīng)答模式(NIO)。
(4)配置方法:在server.xml中 ,將?<Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改為:
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>其中,原來(lái)的protocol="HTTP/1.1"表示遵循h(huán)ttp1.1協(xié)議,同時(shí),也是一個(gè)最原始的未經(jīng)優(yōu)化的通信協(xié)議,
修改之后的?protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式啟動(dòng)。
3. 啟用外部連接池,來(lái)滿足高并發(fā)已經(jīng)復(fù)用的請(qǐng)求
圖2
? maxThreads:tomcat起動(dòng)的最大線程數(shù),即同時(shí)處理的任務(wù)個(gè)數(shù),默認(rèn)值為200。將
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/>注釋打開,并修改maxThreads的值,然后在<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol"/>
中加入?executor="tomcatThreadPool",即最后為:
<Connector connectionTimeout="20000" port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"/>? ? ? 根據(jù)業(yè)務(wù)場(chǎng)景和服務(wù)器硬件資源條件可以適當(dāng)?shù)募哟缶€程連接池,根據(jù)第三方工具去開啟并發(fā)測(cè)試來(lái)確定一個(gè)最好的連接池?cái)?shù)。
4. 優(yōu)化連接器
最佳實(shí)踐:
<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"enableLookups="false"maxPostSize="10485760"URIEncoding="UTF-8" useBodyEncodingForURI="true"acceptCount="100"acceptorThreadCount="2"disableUploadTimeout="true" maxConnections="10000"SSLEnabled="false"/>5. 在tomcat中設(shè)置JVM參數(shù)
修改bin/catalina.bat文件設(shè)置參數(shù)(注釋后第一行),增加
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPerPermSize=356m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50 -XX:+DisableExplicitGC? -Xms:設(shè)置JVM初始內(nèi)存大小(默認(rèn)是物理內(nèi)存的1/64)
-Xmx:設(shè)置JVM可以使用的最大內(nèi)存(默認(rèn)是物理內(nèi)存的1/4,建議:物理內(nèi)存80%)
-Xmn:設(shè)置JVM最小內(nèi)存(128-256m就夠了,一般不設(shè)置)
默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到-Xms的最小限制。因此服務(wù)器一般設(shè)置-Xms、
-Xmx相等以避免在每次GC 后調(diào)整堆的大小。
?在較大型的應(yīng)用項(xiàng)目中,默認(rèn)的內(nèi)存是不夠的,有可能導(dǎo)致系統(tǒng)無(wú)法運(yùn)行。常見(jiàn)的問(wèn)題是報(bào)Tomcat內(nèi)存溢出錯(cuò)誤“java.lang.OutOfMemoryError:Java heap space”,從而
導(dǎo)致客戶端顯示500錯(cuò)誤。
-XX:PermSize :為JVM啟動(dòng)時(shí)Perm的內(nèi)存大小
-XX:MaxPermSize :為最大可占用的Perm內(nèi)存大小(默認(rèn)為32M)
-XX:MaxNewSize,默認(rèn)為16M
PermGen space的全稱是Permanent Generationspace,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被放到
PermGenspace中,它和存放類實(shí)例(Instance)的Heap區(qū)域不同,GC(GarbageCollection)不會(huì)在主程序運(yùn)行期對(duì)PermGenspace進(jìn)行清理,所以如果你的應(yīng)用中有很CLASS的
話,就很可能出現(xiàn)“java.lang.OutOfMemoryError:PermGen space”錯(cuò)誤。
對(duì)于WEB項(xiàng)目,jvm加載類時(shí),永久域中的對(duì)象急劇增加,從而使jvm不斷調(diào)整永久域大小,為了避免調(diào)整),你可以使用更多的參數(shù)配置。如果你的WEBAPP下都用了大量的第三
方j(luò)ar, 其大小超過(guò)了jvm默認(rèn)的大小,那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。
其它參數(shù):
-XX:NewSize :默認(rèn)為2M,此值設(shè)大可調(diào)大新對(duì)象區(qū),減少FullGC次數(shù)
-XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認(rèn)為8)
-XX:SurvivorRatio :改變Eden對(duì)象空間和殘存空間的尺寸比例,意思是Eden對(duì)象空間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)
-XX:userParNewGC 可用來(lái)設(shè)置并行收集【多CPU】
-XX:ParallelGCThreads 可用來(lái)增加并行度【多CPU】
-XXUseParallelGC 設(shè)置后可以使用并行清除收集器【多CPU】
轉(zhuǎn)載于:https://www.cnblogs.com/xbq8080/p/6417671.html
總結(jié)
以上是生活随笔為你收集整理的Tomcat7性能优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到自己毁容预示着什么
- 下一篇: 关于tornado中session的总结