【Tomcat优化篇】如何让你的Tomcat性能更加优越
Tomcat優(yōu)化篇
一、Tomcat自身配置
1.Tomcat管理頁面
??我們可以打開Tomcat的管理頁面,這塊需要先配置下,在 tomcat-users.xml中添加相關(guān)的用戶和角色信息
<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" />如果訪問提示出現(xiàn)了403的錯(cuò)誤,則修改webapps/manager/META-INF/context.xml中的內(nèi)容
訪問Tomcat服務(wù)
然后輸入配置的賬號(hào)密碼
可以看到對(duì)應(yīng)的監(jiān)控信息
2. 禁用AJP服務(wù)
??AJP是定向包協(xié)議。因?yàn)樾阅茉?#xff0c;使用二進(jìn)制格式來傳輸可讀性文本。WEB服務(wù)器通過TCP連接和SERVLET容器連接。為了減少進(jìn)程生成socket的花費(fèi),
WEB服務(wù)器和SERVLET容器之間嘗試保持持久性的TCP連接,對(duì)多個(gè)請(qǐng)求/回復(fù)循環(huán)重用一個(gè)連接。一旦連接分配給一個(gè)特定的請(qǐng)求,在請(qǐng)求處理循環(huán)結(jié)束之前不會(huì)再分配。
換句話說,在連接上,請(qǐng)求不是多元的。這個(gè)使連接兩端的編碼變得容易,雖然這導(dǎo)致在一時(shí)刻會(huì)有很多連接。
我們一般使用的Nginx+Tomcat的架構(gòu),所以用不著AJP協(xié)議,可以把AJP連接器禁用掉
3.Executor優(yōu)化
??在Tomcat中每一個(gè)用戶請(qǐng)求都是一個(gè)線程,針對(duì)線程池我們也可以提供對(duì)應(yīng)的優(yōu)化來提升性能。
<!-- 自定義線程池 --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/><!-- A "Connector" represents an endpoint by which requests are receivedand responses are returned. Documentation at :Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)Java AJP Connector: /docs/config/ajp.htmlAPR (HTTP/AJP) Connector: /docs/apr.htmlDefine a non-SSL HTTP/1.1 Connector on port 8080--><Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />涉及到的幾個(gè)參數(shù)
| maxThreads | 最大的并發(fā)數(shù),不同版本默認(rèn)值有差別(150~200),一般建議500-1000 |
| minSpareThreads | 初始化的線程數(shù) |
| maxQueueSize | 最大等待的隊(duì)列數(shù),超過就拒絕了 |
4.三種運(yùn)行模式
bio:默認(rèn)的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持。
nio:new I/O,同步非阻塞的I/O操作,比傳統(tǒng)的bio有更好的并發(fā)運(yùn)行性能。
apr:需要安裝 apr 、 apr-utils 、tomcat-native包,比較麻煩。是Apache HTTP服務(wù)器的支持庫。你可以簡單地理解為,Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫來處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高Tomcat對(duì)靜態(tài)文件的處理性能。 Tomcat apr也是在Tomcat上運(yùn)行高并發(fā)應(yīng)用的首選模式。
@Deprecatedpublic void setProtocol(String protocol) {boolean aprConnector = AprLifecycleListener.isAprAvailable() &&AprLifecycleListener.getUseAprConnector();if ("HTTP/1.1".equals(protocol) || protocol == null) {if (aprConnector) {setProtocolHandlerClassName("org.apache.coyote.http11.Http11AprProtocol");} else {setProtocolHandlerClassName("org.apache.coyote.http11.Http11NioProtocol");}} else if ("AJP/1.3".equals(protocol)) {if (aprConnector) {setProtocolHandlerClassName("org.apache.coyote.ajp.AjpAprProtocol");} else {setProtocolHandlerClassName("org.apache.coyote.ajp.AjpNioProtocol");}} else {setProtocolHandlerClassName(protocol);}}調(diào)整對(duì)應(yīng)的配置
5.web.xml
最終觀察tomcat啟動(dòng)日志[時(shí)間/內(nèi)容],線程開銷,內(nèi)存大小,GC等
DefaultServlet
<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>JspServlet
<servlet><servlet-name>jsp</servlet-name><servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class><init-param><param-name>fork</param-name><param-value>false</param-value></init-param><init-param><param-name>xpoweredBy</param-name><param-value>false</param-value></init-param><load-on-startup>3</load-on-startup></servlet>welcome-list-file
<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>mime-mapping移除響應(yīng)的內(nèi)容
<mime-mapping><extension>zip</extension><mime-type>application/zip</mime-type></mime-mapping><mime-mapping><extension>zir</extension><mime-type>application/vnd.zul</mime-type></mime-mapping>session-config
默認(rèn)jsp頁面有session,就是在于這個(gè)配置
6.Host標(biāo)簽
autoDeploy :Tomcat運(yùn)行時(shí),要用一個(gè)線程拿出來進(jìn)行檢查,生產(chǎn)環(huán)境之下一定要改成false
unpackWARs:war包自動(dòng)解壓縮,同樣的生產(chǎn)環(huán)境改為false
7.Context標(biāo)簽
reloadable:false
reloadable:如果這個(gè)屬性設(shè)為true,tomcat服務(wù)器在運(yùn)行狀態(tài)下會(huì)監(jiān)視在WEB-INF/classes和WEB-INF/lib目錄下 class文件的改動(dòng),如果監(jiān)測(cè)到有class文件被更新的,服務(wù)器會(huì)自動(dòng)重新加載Web應(yīng)用。
在開發(fā)階段將reloadable屬性設(shè)為true,有助于調(diào)試servlet和其它的class文件,但這樣用加重服務(wù)器運(yùn)行負(fù)荷,建議 在Web應(yīng)用的發(fā)存階段將reloadable設(shè)為false。
8.啟動(dòng)速度優(yōu)化
9.其他方面
- Connector:配置壓縮屬性compression=“500”,文件大于500bytes才會(huì)壓縮
- 數(shù)據(jù)庫優(yōu)化:減少對(duì)數(shù)據(jù)庫訪問等待的時(shí)間,可以從數(shù)據(jù)庫的層面進(jìn)行優(yōu)化,或者加緩存等等各種方案。
- 開啟瀏覽器緩存,nginx靜態(tài)資源部署
二、JMeter測(cè)試
??針對(duì)相關(guān)數(shù)據(jù)的測(cè)試我們可以通過JMeter來直觀的給大家來展示。我們?cè)趖omcat8.0的服務(wù)中部署一個(gè)war服務(wù)。
我們找一個(gè)FlowableUI的war包,正常啟動(dòng):可以正常訪問
然后我們通過JMeter來壓測(cè):
設(shè)置請(qǐng)求相關(guān)信息
選擇幾個(gè)監(jiān)聽器
然后執(zhí)行:吞吐量:4103
然后我們禁用掉AJP
再測(cè)試:4149 稍微有點(diǎn)提升
然后我們自定義線程池
<!-- 自定義線程池 --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>記得關(guān)聯(lián)上
吞吐量:4188
我們把線程池的相關(guān)數(shù)據(jù)調(diào)整下:最大線程數(shù)1000,最小線程數(shù)100再看看
沒有太大的區(qū)別,這時(shí)我們可以設(shè)置最大的等待隊(duì)列:maxQueueSize=“100”
我們可以發(fā)現(xiàn)當(dāng)添加了最大阻塞隊(duì)列后吞吐量提升到了5203了,提升效果顯著,但是同樣的異常率提升了很多32.6%,當(dāng)然這也是正常的現(xiàn)象了。
最后我們修改下運(yùn)行的模式。改為NIO2,同時(shí)不加最大等待隊(duì)列來看看
<!-- 自定義線程池 --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" /><Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"connectionTimeout="20000"redirectPort="8443" />總結(jié)
以上是生活随笔為你收集整理的【Tomcat优化篇】如何让你的Tomcat性能更加优越的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式的薪资还是挺低的
- 下一篇: 去广州见了我大学老师标哥