【Tomcat优化篇】如何让你的Tomcat性能更加优越
Tomcat優化篇
一、Tomcat自身配置
1.Tomcat管理頁面
??我們可以打開Tomcat的管理頁面,這塊需要先配置下,在 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" />如果訪問提示出現了403的錯誤,則修改webapps/manager/META-INF/context.xml中的內容
訪問Tomcat服務
然后輸入配置的賬號密碼
可以看到對應的監控信息
2. 禁用AJP服務
??AJP是定向包協議。因為性能原因,使用二進制格式來傳輸可讀性文本。WEB服務器通過TCP連接和SERVLET容器連接。為了減少進程生成socket的花費,
WEB服務器和SERVLET容器之間嘗試保持持久性的TCP連接,對多個請求/回復循環重用一個連接。一旦連接分配給一個特定的請求,在請求處理循環結束之前不會再分配。
換句話說,在連接上,請求不是多元的。這個使連接兩端的編碼變得容易,雖然這導致在一時刻會有很多連接。
我們一般使用的Nginx+Tomcat的架構,所以用不著AJP協議,可以把AJP連接器禁用掉
3.Executor優化
??在Tomcat中每一個用戶請求都是一個線程,針對線程池我們也可以提供對應的優化來提升性能。
<!-- 自定義線程池 --><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" />涉及到的幾個參數
| maxThreads | 最大的并發數,不同版本默認值有差別(150~200),一般建議500-1000 |
| minSpareThreads | 初始化的線程數 |
| maxQueueSize | 最大等待的隊列數,超過就拒絕了 |
4.三種運行模式
bio:默認的模式,性能非常低下,沒有經過任何優化處理和支持。
nio:new I/O,同步非阻塞的I/O操作,比傳統的bio有更好的并發運行性能。
apr:需要安裝 apr 、 apr-utils 、tomcat-native包,比較麻煩。是Apache HTTP服務器的支持庫。你可以簡單地理解為,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高并發應用的首選模式。
@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);}}調整對應的配置
5.web.xml
最終觀察tomcat啟動日志[時間/內容],線程開銷,內存大小,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移除響應的內容
<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
默認jsp頁面有session,就是在于這個配置
6.Host標簽
autoDeploy :Tomcat運行時,要用一個線程拿出來進行檢查,生產環境之下一定要改成false
unpackWARs:war包自動解壓縮,同樣的生產環境改為false
7.Context標簽
reloadable:false
reloadable:如果這個屬性設為true,tomcat服務器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下 class文件的改動,如果監測到有class文件被更新的,服務器會自動重新加載Web應用。
在開發階段將reloadable屬性設為true,有助于調試servlet和其它的class文件,但這樣用加重服務器運行負荷,建議 在Web應用的發存階段將reloadable設為false。
8.啟動速度優化
9.其他方面
- Connector:配置壓縮屬性compression=“500”,文件大于500bytes才會壓縮
- 數據庫優化:減少對數據庫訪問等待的時間,可以從數據庫的層面進行優化,或者加緩存等等各種方案。
- 開啟瀏覽器緩存,nginx靜態資源部署
二、JMeter測試
??針對相關數據的測試我們可以通過JMeter來直觀的給大家來展示。我們在tomcat8.0的服務中部署一個war服務。
我們找一個FlowableUI的war包,正常啟動:可以正常訪問
然后我們通過JMeter來壓測:
設置請求相關信息
選擇幾個監聽器
然后執行:吞吐量:4103
然后我們禁用掉AJP
再測試:4149 稍微有點提升
然后我們自定義線程池
<!-- 自定義線程池 --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>記得關聯上
吞吐量:4188
我們把線程池的相關數據調整下:最大線程數1000,最小線程數100再看看
沒有太大的區別,這時我們可以設置最大的等待隊列:maxQueueSize=“100”
我們可以發現當添加了最大阻塞隊列后吞吐量提升到了5203了,提升效果顯著,但是同樣的異常率提升了很多32.6%,當然這也是正常的現象了。
最后我們修改下運行的模式。改為NIO2,同時不加最大等待隊列來看看
<!-- 自定義線程池 --><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" />總結
以上是生活随笔為你收集整理的【Tomcat优化篇】如何让你的Tomcat性能更加优越的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式的薪资还是挺低的
- 下一篇: 去广州见了我大学老师标哥