出處:微信訂閱號GitChat精品課程 — Tomcat性能優化javascript
Tomcat 簡單介紹css
Sun 公司建立了第一個 Servlet 容器,即 Java Web Server,但 JWS 只是爲了演示 Servlet 的相應功能,因此其性能很不穩定。與此同時,apache 基金會組織 (ASF) 建立了 JServ 項目,一個可以與 apache 整合起來的 servlet 容器。html
1999 年,Sun 公司把 JWS 捐給了 ASF,因而兩個項目合二爲一,即今天 Tomcat 的前身。第一個 tomcat 版本是 Tomcat 3.x 系列,而發佈於 2001 年 Tomcat4.0 則是在此前基礎上進行了從新設計和實現,其代碼項目被命名爲 Catalina。java
Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試 JSP 程序的首選。node
版本介紹:如今版本更新到 Apache Tomcat 8.x,可是 Apache Tomcat 7.x 是目前開發的焦點。Apache Tomcat 7.x 它在汲取了 Tomcat 6.0.x 優勢的基礎上,實現了對於 Servlet 3.0、JSP 2.2 和 EL 2.2 等特性的支持。web
除此之外的改進列表以下:shell
Web 應用內存溢出偵測和預防apache
加強了管理程序和服務器管理程序的安全性vim
通常 CSRF 保護windows
支持 web 應用中的外部內容的直接引用
重構 (connectors, lifecycle) 及不少核心代碼的全面梳理
tomcat 運行模式介紹
Tomcat Connector(Tomcat 鏈接器) 有 bio、nio、apr 三種運行模式,那麼這三種運行模式有什麼區別呢,咱們又如何修改 Tomcat Connector 的運行模式來提升 Tomcat 的運行性能呢?
bio 模式
bio(blocking I/O),顧名思義,即阻塞式 I/O 操做,表示 Tomcat 使用的是傳統的 Java I/O 操做 (即 java.io 包及其子包)。Tomcat 在默認狀況下,就是以 bio 模式運行的。遺憾的是,就通常而言,bio 模式是三種運行模式中性能最低的一種。咱們能夠經過 Tomcat Manager 來查看服務器的當前狀態。
[root@web conf]# cd /data/node1/conf/tomcat-users.xml
[root@web conf]# vim tomcat-users.xml #添加進去兩行代碼,也就是新建立一個帳號和密碼
<role rolename="manager-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui"/>
添加以後,而後保存退出此文件。想讓配置文件生效,須要重啓下 tomcat。
[root@web conf]# /data/node1/bin/shutdown.sh [root@web conf]# /data/node1/bin/startup.sh
nio 模式
nio(new I/O),是 Java SE 1.4 及後續版本提供的一種新的 I/O 操做方式 (即 java.nio 包及其子包)。Java nio 是一個基於緩衝區、並能提供非阻塞 I/O 操做的 Java API,所以 nio 也被當作是 non-blocking I/O 的縮寫。它擁有比傳統 I/O 操做 (bio) 更好的併發運行性能。要讓 Tomcat 以 nio 模式來運行也比較簡單,咱們只須要在 Tomcat 安裝目錄 / conf/server.xml 文件中將以下配置:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
其中的 protocol 屬性值改成 org.apache.coyote.http11.Http11NioProtocol 便可:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443" />
此時,咱們就能夠在 Tomcat Manager 中看到當前服務器狀態頁面的 HTTP 協議的 Connector 運行模式已經從 http-bio-8080 變成了 http-nio-8080。
apr 模式
apr(Apache Portable Runtime/Apache 可移植運行時),是 Apache HTTP 服務器的支持庫。你能夠簡單地理解爲,Tomcat 將以 JNI 的形式調用 Apache HTTP 服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,從而大大地提升 Tomcat 對靜態文件的處理性能。
Tomcat apr 也是在 Tomcat 上運行高併發應用的首選模式。若是咱們的 Tomcat 不是在 apr 模式下運行,在啓動 Tomcat 的時候,咱們能夠在日誌信息中看到相似以下信息:
org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: xxx/xxx(這裏是路徑信息)
Tomcat apr 運行模式的配置是三種運行模式之中相對比較麻煩的一種。據官方文檔所述,Tomcat apr 須要如下三個組件的支持:
APR library[APR 庫] JNI wrappers for APR used by Tomcat (libtcnative)[簡單地說,若是是在 Windows 操做系統上,就是一個名爲 tcnative-1.dll 的動態連接庫文件]
OpenSSL libraries[OpenSSL 庫] 此外,與配置 nio 運行模式同樣,也須要將對應的 Connector 節點的 protocol 屬性值改成org.apache.coyote.http11.Http11AprProtocol
。 不過,上述繁瑣的操做都是 Tomcat 7.0.30 以前的版本才須要這樣配置,從 Tomcat 7.0.30 版本開始,Tomcat 已經自帶了 tcnative-1.dll 等文件,而且默認就是在 Tomcat apr 模式下運行,所以咱們只須要下載最新版本的 Tomcat 直接使用便可。
默認狀況下是 bio 模式,介紹下怎麼更換成 apr 模式:(待驗證)
[root@web]#yum install -y apr apr-util apr-devel
[root@web]# cd /data/node1/bin
[root@web bin]# tar -zxvf tomcat-native.tar.gz
[root@web bin]# cd tomcat-native-1.1.32-src/jni/native/
[root@web native]# ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr/include/openssl/
[root@web native]# make && make installtomcat和apr庫整合,須要修改shell腳本文件catalina.sh [root@web node1]# vim /data/node1/bin/catalina.sh
+99JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC" cygwin=falsedarwin=falseCATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"os400=false
保存退出,重啓 tomcat。看 tomcat 啓動輸出日誌信息:
信息: Deploying web application directory /data/node1/webapps/host-manager
四月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory /data/node1/webapps/host-manager has finished in 156 ms
四月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /data/node1/webapps/examples
四月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory /data/node1/webapps/examples has finished in 1,490 ms
四月 10, 2018 16:42:19 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["http-apr-8080"]
四月 10, 2018 16:42:19 下午 org.apache.catalina.startup.Catalina start信息: Server startup in 25191 ms
出現了 ["http-apr-8080"] 字段,說明如今 tomcat 已是 apr 模式。
apr模式也可參考其餘文章:
Tomcat 安全和性能優化
內存優化
修改內存等 JVM 相關配置
Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入,能夠放在 CLASSPATH = 下面:
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"
windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入,能夠放在 set CLASSPATH = 下面:
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
這些參數在咱們學習 JVM 部分文章時已經都認識過了,不過這裏仍是簡單介紹下:
-server:啓用 JDK的 server 版本;
-Xms:Java虛擬機初始化時堆的最小內存,通常與 Xmx配置爲相同值,這樣的好處是GC沒必要再爲擴展內存空間而消耗性能;
-Xmx:Java虛擬機可以使用堆的最大內存;
-XX:PermSize:Java虛擬機永久代大小;
-XX:MaxPermSize:Java虛擬機永久代大小最大值;
除了這些參數外您還能夠根據具體須要配置其餘參數,參數的配置能夠參考 JVM 參數的配置。
配置優化
咱們知道 TOMCAT_HOME/conf/server.xml 能夠配置端口,虛擬路徑等等 Tomcat 相關主要配置。
1) Connector 優化
Connector 是鏈接器,負責接收客戶的請求,以及向客戶端回送響應的消息。因此 Connector 的優化是重要部分。默認狀況下 Tomcat 只支持 200 線程訪問,超過這個數量的鏈接將被等待甚至超時放棄,因此咱們須要提升這方面的處理能力。
修改這部分配置須要修改 TOMCAT_HOME/conf/server.xml,打開 server.xml 找到 Connector 標籤項,默認配置以下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
其中 port 表明服務接口;protocol 表明協議類型;connectionTimeout 表明鏈接超時時間,單位爲毫秒;redirectPort 表明安全通訊(https)轉發端口,通常配置成 443。
能夠看到除了這幾個基本配置外並沒有特殊功能,因此咱們須要對 Connector 進行擴展。
其中 Connector 支持參數屬性能夠參考 Tomcat 官方網站(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html ),很是多,因此本文就只介紹些經常使用的。
咱們將 Connector 配置修改成以下:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" maxHttpHeaderSize="8192" tcpNoDelay="true" redirectPort="8443" enableLookups="false" URIEncoding="UTF-8" />
port:表明 Tomcat 監聽端口,也就是網站的訪問端口,默認爲 8080,能夠根據須要改爲其餘。 -protocol:協議類型,可選類型有四種,分別爲 BIO(阻塞型 IO),NIO,NIO2 和 APR。
BIO:BIO(Blocking I/O),顧名思義,即阻塞式 I/O 操做,表示 Tomcat 使用的是傳統的 Java I/O 操做 (即 java.io 包及其子包)。
Tomcat 在默認狀況下,是以 bio 模式運行的。遺憾的是,就通常而言,bio 模式是三種運行模式中性能最低的一種。
BIO 配置採用默認便可。 NIO:NIO(New I/O),是 Java SE 1.4 及後續版本提供的一種新的 I/O 操做方式 (即 java.nio 包及其子包)。
Java nio 是一個基於緩衝區、並能提供非阻塞 I/O 操做的 Java API,所以 nio 也被當作是 non-blocking I/O 的縮寫。
它擁有比傳統 I/O 操做 (bio) 更好的併發運行性能。要讓 Tomcat 以 nio 模式來運行也比較簡單,咱們只須要 protocol 類型修改成:
//NIO protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2 protocol="org.apache.coyote.http11.Http11Nio2Protocol" 便可。
Executor 表明了一個線程池,能夠在 Tomcat 組件之間共享。使用線程池的好處在於減小了建立銷燬線程的相關消耗,並且能夠提升線程的使用效率。
要想使用線程池,首先須要在 Service 標籤中配置 Executor,以下:
<Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> ....
其中,name:線程池名稱,用於 Connector中指定。namePrefix:所建立的每一個線程的名稱前綴,一個單獨的線程名稱爲 namePrefix+threadNumber。maxThreads:池中最大線程數。minSpareThreads:活躍線程數,也就是核心池線程數,這些線程不會被銷燬,會一直存在。maxIdleTime:線程空閒時間,超過該時間後,空閒線程會被銷燬,默認值爲6000(1分鐘),單位毫秒。maxQueueSize:在被執行前最大線程排隊數目,默認爲Int的最大值,也就是廣義的無限。除非特殊狀況,這個值不須要更改,不然會有請求不會被處理的狀況發生。prestartminSpareThreads:啓動線程池時是否啓動 minSpareThreads部分線程。默認值爲false,即不啓動。threadPriority:線程池中線程優先級,默認值爲5,值從1到10。className:線程池實現類,未指定狀況下,默認實現類爲org.apache.catalina.core.StandardThreadExecutor。若是想使用自定義線程池首先須要實現 org.apache.catalina.Executor接口。
線程池配置完成後須要在 Connector 中指定:
<Connector executor="tomcatThreadPool" ...
3) Listener 配置
另外一個影響 Tomcat 性能的因素是內存泄露。Server 標籤中能夠配置多個 Listener,其中 JreMemoryLeakPreventionListener 是用來預防 JRE 內存泄漏。此 Listener 只需在 Server 標籤中配置便可,默認狀況下無需配置,已經添加在 Server 中。
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
緩存優化
參數說明
compression 打開壓縮功能 compressionMinSize 啓用壓縮的輸出內容大小,這裏面默認爲2KB compressableMimeType 壓縮類型 connectionTimeout 定義創建客戶鏈接超時的時間. 若是爲 -1, 表示不限制創建客戶鏈接的時間 <Connector port="9027" ........... compression="on" compressionMinSize="2048"connectionTimeout="20000"compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"................ />
你們經過以上咱們隊 tomcat 的有效配置,包括 (從內存,運行模式、併發、緩存 4 個方面) 優化。能讓本身的項目穩定的服務於客戶,達到咱們理想的運行效果。
另外一篇tomcat優化文章推薦:https://286.iteye.com/blog/2298505