Tomcat 的兩類調優方式

一、Tomcat 調優大致分為兩大類:

1??Tomcat 的自身調優:

  1. 采用動靜分離節約 Tomcat 的性能
  2. 禁用 AJP 連接器
  3. 調整 Tomcat 的線程池
  4. 調整 Tomcat 的連接器
  5. 修改 Tomcat 的運行模式

2??JVM 的調優:調優 JVM 內存

二、Tomcat 自身調優

1??采用動靜分離

靜態資源如果也讓 Tomcat 處理的話,Tomcat 的性能會被損耗很多。所以一般都是采用:Nginx+Tomcat 實現動靜分離。Nginx 實現靜態資源的訪問,讓 Tomcat 只負責 jsp 文件的解析工作。

2??禁用 AJP 連接器

AJP 的全稱 Apache JServer Protocol。使用 Nginx+Tomcat 的架構,用不著 AJP,所以禁用。

  1. Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入如下代碼,可以放在 CLASSPATH = 下面:
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"
  1. windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入如下代碼,可以放在 set CLASSPATH = 下面:
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

參數說明:

  • -server:啟用 JDK 的 server 版本;
  • -Xms:Java 虛擬機初始化時堆的最小內存,一般與 Xmx 配置為相同值,這樣的好處是 GC 不必再為擴展內存空間而消耗性能;
  • -Xmx:Java 虛擬機可使用堆的最大內存;
  • -XX:PermSize:Java 虛擬機永久代大小;
  • -XX:MaxPermSize:Java 虛擬機永久代大小最大值;

3??調優 Tomcat 線程池

打開 tomcat 的 server.xml,配置 Executor,相關參數說明如下:

??<Executor 
     name="tomcatThreadPool" 
     namePrefix="catalina-exec-" 
     maxThreads="150" 
     minSpareThreads="4" 
     maxIdLeTime="60000"/>

參數解釋:

  • name:給執行器(線程池)起一個名字
  • namePrefix:指定線程池中的每一個線程的 name 前綴
  • maxThreads:線程池中最大的線程數量
    假設:請求的數量超過了“750”,這不是意味著將 maxThreads 屬性值設置為“750”,它的最好解決方案是使用“Tomcat集群”。也就是說,如果有“1000”請求,兩個 Tomcat 實例設置“maxThreads= 500”,而不是在單 Tomcat 實例的情況下設置 maxThreads=1000。
  • minSpareThreads:線程池中允許空閑的線程數量(多余的線程都殺死)
  • maxIdLeTime:一個線程空閑多久算是一個空閑線程

4??調優 Tomcat 的連接器 Connector

打開 Tomcat 的 server.xml,(比較完整)配置 Connector,參數說明如下:

<Connector 
     executor = "tomcatThreadPool"
     port="8081" 
     protocol="HTTP/1.1" 
     connectionTimeout="20000"
     enableLookups="false"
     URIEncoding="UTF-8" 
     redirectPort="8443"
     maxThreads="600" 
     minSpareThreads="100" 
     acceptCount="700"
     maxSpareThreads="500" 
     server="None" />

參數解釋:

  • executor:指定這個連接器所使用的執行器(線程池)。對應“Executor ”配置中的name值。
  • enableLookups="false":關閉 DNS 解析,減少性能損耗。
  • maxThreads="X" 表示最多同時處理 X 個連接。相當于最大線程數。
  • minSpareThreads="X" 初始化 X 個連接。最小空閑線程數,這里是一直會運行的線程。
  • acceptCount="X" 當同時連接的人數達到 maxThreads 時,還可以排隊,隊列大小為 X。超過 X 就不處理。
  • maxSpareThreads="X" 表示如果最多可以有 X 個線程,一旦超過 X 個,則會關閉不再需要的線程。
  • minProcessors:服務器啟動時創建的最少線程數;
  • maxProcessors:最大可以創建的線程數;

注意:
與壓縮有關系的配置:如果已經對代碼進行了動靜分離,靜態頁面和圖片等數據就不需要 Tomcat 處理了,那么也就不需要在 Tomcat 中配置壓縮了。

5??通過修改 Tomcat 的運行模式

同步阻塞IO (JAVA BIO)
Tomcat8 以下版本,默認使用的就是 BIO 模式。服務器實現模式為一個連接一個線程(one connection one thread),對于每一個請求都要創建一個線程來進行處理,不適合高并發。當然可以通過線程池機制改善。

同步非阻塞IO (JAVA NIO)
又分為異步阻塞 IO。與 BIO 最大的區別 one request one thread。可以復用同一個線程處理多個 connection(多路復用)。Tomcat8 以上版本,默認使用的就是NIO模式「非阻塞式 IO」。

異步非阻塞IO (Java NIO2又叫AIO)
與NIO的區別主要是操作系統的底層區別。可以做個比喻:比作快遞,NIO就是網購后要自己到官網查下快遞是否已經到了(可能是多次),然后自己去取快遞;AIO就是快遞員送貨上門了(不用關注快遞進度)。

適用:

BIO 方式適用于連接數目比較小且固定的架構。這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4 以前的唯一選擇,但程序直觀簡單易理解。

NIO 方式適用于連接數目多且連接比較短(輕操作)的架構。比如聊天服務器,并發局限于應用中,編程比較復雜,JDK1.4 開始支持。

AIO 方式使用于連接數目多且連接比較長(重操作)的架構。比如相冊服務器,充分調用 OS 參與并發操作,編程比較復雜,JDK7 開始支持。

在server.xml中:

<Connector 
    executor = "tomcatThreadPool"
    port="8081" 
    protocol="HTTP/1.1"  
    connectionTimeout="20000" 
    URIEncoding="UTF-8"
    enableLookups="false" />

實現對Tomcat的IO切換。

APR(Apache Portable Runtime)

APR 是一個高可移植庫。它是 Apache HTTP Server 2.x 的核心,能更好地和其它本地 web 技術集成,總體上讓 Java 更有效率作為一個高性能 web 服務器平臺而不是簡單作為后臺容器。是 Tomcat 生產環境運行的首選方式,如果操作系統未安裝 APR 或者 APR 路徑未指到 Tomcat 默認可識別的路徑,則 APR 模式無法啟動,自動切換啟動 NIO 模式。所以必須要安裝 Apache Tomcat Native Library,直接啟動就支持 APR,APR 是從操作系統級別解決異步 IO 問題,排除代碼問題 Tomcat 優化到這個層次,可以大幅度的提高性能。APR 的本質就是使用 JNI 技術調用操作系統底層的 IO 接口,所以需要提前安裝所需要的依賴。

在產品環境中,特別是直接使用 Tomcat 做 WEB 服務器的時候,應該使用 Tomcat Native 來提高其性能。如果不配 APR,基本上 300 個線程很快就會用滿,以后的請求就只好等待。但是配上 APR 之后,并發的線程數量明顯下降,從原來的 300 可能會馬上下降到只有幾十,新的請求會毫無阻塞的進來。
在局域網環境測,就算是 400 個并發,也是一瞬間就處理/傳輸完畢,但是在真實的 Internet 環境下,頁面處理時間只占 0.1% 都不到,絕大部分時間都用來頁面傳輸。如果不用 APR,一個線程同一時間只能處理一個用戶,勢必會造成阻塞。所以生產環境下用 APR 是非常必要的。

三、JVM 調優

Tomcat 是運行在 JVM 上的,所以對 JVM 的調優也是非常有必要的。啟動時告訴 JVM 要一塊大內存,調優內存是最直接的方式。調整堆大小的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。找到 catalina.sh:

添加:

JAVA_OPTS='-Xms256m -Xmx512m'

完整參數設置:

JAVA_OPTS="-Djava.awt.headless=true 
-Dfile.encoding=UTF-8-server 
-Xms1024m 
-Xmx1024m 
-XX:NewSize=512m 
-XX:MaxNewSize=512m 
-XXermSize=512m 
-XX:MaxPermSize=512m 
-XX:+DisableExplicitGC"
  • -Xms<size> Java 虛擬機初始化時堆的最小內存,一般與 Xmx 配置為相同值,這樣的好處是 GC 不必再為擴展內存空間而消耗性能;
  • -Xmx<size> Java 虛擬機可使用堆的最大內存。實際參數大小根據服務器配置或者項目具體設置。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容