Tomcat優化


最近由於工作上的原因,需要對 Tomcat 並發進行優化。之前也做過一次 Tomcat 優化,但並沒有記錄下來,趁着最近不忙,學習並記錄一下優化的過程。

Tomcat 中的三種運行模式之運行模式的優化

修改 Tomcat 的運行模式:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 修改為NIO模式:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     redirectPort="8443" />

驗證成功方式:Tomcat 日志控制台最后
如果是 http-bio-8080 是 bio
如果是 http-nio-8080 是 nio

1、BIO(阻塞式):Tomcat 的默認模式,該模式性能較低,沒有經過任何優化處理和支持,一個線程處理一個請求。缺點:並發量過大時,線程數較多,浪費資源。Tomcat7 及以下版本,在 linux 系統中默認使用該模式。

2、NIO-Non-blocking IO(非阻塞IO):Java NIO 可以讓你非阻塞的使用 IO,例如:當線程從通道讀取數據到緩沖區時,線程還是可以進行其他事情。當數據被寫入到緩沖區時,線程可以繼續處理它。從緩沖區寫入通道也類似。Tomcat8 在Linux系統中默認使用這種方式。

3、APR:Apache Portable Runtime,從操作系統層面解決io阻塞問題。Tomcat7 或 Tomcat8 在 Win7 或以上的系統中啟動默認使用這種方式。Linux 如果安裝了 apr 和 native,Tomcat 直接啟動就支持 apr。

Tomcat 執行器(線程池)的優化

Tomcat 默認是沒有啟用線程池的,在 Tomcat 中每一個用戶請求都是一個線程,所以我們可以使用線程池來提高性能。Tomcat 的前段有一個調度線程,會將用戶的請求放入線程池中,一定時間后線程池中的用戶請求任務就變為工作線程。

1、開啟線程池:打開 server.xml 中關於線程池的配置

<Executor name="TomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="600" minSpareThreads="10"/>

重要參數說明:

name:共享線程池的名字。這是 Connector 為了共享線程池要引用的名字,該名字必須唯一。默認值:None;

namePrefix:在 JVM 上,每個運行線程都可以有一個 name 字符串。這一屬性為線程池中每個線程的 name 字符串設置了一個前綴,Tomcat 將把線程號追加到這一前綴的后面。默認值:Tomcat-exec-;

maxThreads:該線程池可以容納的最大線程數。默認值:200;

maxIdleTime:在 Tomcat 關閉一個空閑線程之前,允許空閑線程持續的時間(以毫秒為單位)。只有當前活躍的線程數大於 minSpareThread 的值,才會關閉空閑線程。默認值:60000(一分鍾)。

minSpareThreads:Tomcat 應該始終打開的最小不活躍線程數。默認值:25。

2、引用線程池

<Connector
     executor="TomcatThreadPool"

     port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     redirectPort="8443"

     maxThreads="1000"
     minSpareThreads="100"
     acceptCount="1000"
     maxConnections="1000"
     maxHttpHeaderSize="8192"
     tcpNoDelay="true"
     compression="on"
     disableUploadTimeout="true"
     enableLookups="false"
     URIEncoding="UTF-8"
     />

maxThreads:最大線程數
minSpareThreads:最小線程數
acceptCount:接受最大隊列長度
maxConnections:最大連接數
connectionTimeout:超時等待時間 毫秒
maxHttpHeaderSize:請求頭最大值
tcpNoDelay:如果為true,服務器socket會設置TCP_NO_DELAY選項,在大多數情況下可以提高性能。缺省情況下設為true
compression:是否開啟壓縮GZIP on開啟 off 關閉 forde:所有情況下都壓縮
disableUploadTimeout:限定上傳時間
enableLookups:關閉DNS反向查詢,DNS反查很耗時間

Tomcat 優化之禁用AJP連接器實現動靜分離

AJP:協議是一個面向包的。web 服務器和 servlet 容器通過 TCP 鏈接進行交互,為了節省 SOCKET 創建的昂貴代價,WEB服務器會嘗試維護一個永久 TCP 鏈接到 Servlet 容器,並在多個請求和響應周期過程會重用鏈接。

由於 Tomcat 服務器相對於 Nginx 服務器在處理靜態資源上效率較低。因此我們的網站服務器一般是 Nginx+Tomcat,Nginx 負責處理靜態資源,因此 AJP 協議我們在使用 Nginx+Tomcat 架構時可以關閉它來進行效率的優化。

注釋 Tomcat server.xml 中 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 即可。

Tomcat 中 JVM 參數優化

對jvm參數的優化我們主要是對堆內存的優化

Linux 下 catalina.sh 在一大段注釋的下面,正文配置的上面加入:

JAVA_OPTS="-server -Xmx2688M -Xms2688M -Xmn960M -XX:MaxTenuringThreshold=10 -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m"

最后推薦一個可以在線對 JVM 參數進行優化的網站:http://xxfox.perfma.com

本文由個人 hexo 博客 co2fe.com 遷移
date: 2018-12-12 10:54:47


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM