天天看點

閑談 Tomcat 性能優化

作者:Java4Park
閑談 Tomcat 性能優化

Tomcat 在各位 JavaWeb 從業者常常就是預設的開發環境,但是 Tomcat 的預設配置作為生産環境,尤其是記憶體和線程的配置,預設都很低,容易成為性能瓶頸.

幸好 Tomcat 還有很多的提升空間。下文介紹一下 Tomcat 優化,可以分為記憶體,線程,IO.

一:Tomcat 記憶體優化,啟動時告訴 JVM 我要一塊大記憶體 (調優記憶體是最直接的方式)

Windows 下的 catalina.bat

Linux 下的 catalina.sh 如:

JAVA_OPTS='-Xms256m -Xmx512m'  
           

-Xms<size> JVM 初始化堆的大小

-Xmx<size> JVM 堆的最大值 實際參數大小根據伺服器配置或者項目具體設定.

二:Tomcat 線程優化 在 server.xml 中 如:

<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"
connectionTimeout="20000"  />
           

maxThreads="X" 表示最多同時處理 X 個連接配接

minSpareThreads="X" 初始化 X 個連接配接

maxSpareThreads="X" 表示如果最多可以有 X 個線程,一旦超過 X 個,則會關閉不在需要的線程

acceptCount="X" 當同時連接配接的人數達到 maxThreads 時,還可以排隊,隊列大小為 X. 超過 X 就不處理

三:Tomcat IO 優化

1: 同步阻塞 IO(JAVA BIO) 同步并阻塞,伺服器實作模式為一個連接配接一個線程 (one connection one thread 想想都覺得恐怖,線程可是非常寶貴的資源),當然可以通過線程池機制改善.

2:JAVA NIO: 又分為同步非阻塞 IO, 異步阻塞 IO 與 BIO 最大的差別 one request one thread. 可以複用同一個線程處理多個 connection (多路複用).

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

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

NIO 方式适用于連接配接數目多且連接配接比較短(輕操作)的架構,比如聊天伺服器,并發局限于應用中,程式設計比較複雜,JDK1.4 開始支援.

AIO 方式使用于連接配接數目多且連接配接比較長(重操作)的架構,比如相冊伺服器,充分調用 OS 參與并發操作,程式設計比較複雜,JDK7 開始支援.

在 server.xml 中

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" 
	connectionTimeout="20000" 
	URIEncoding="UTF-8" 
	useBodyEncodingForURI="true" 
	enableLookups="false" 
	redirectPort="8443" /> 
           

實作對 Tomcat 的 IO 切換.

四:大殺器 APR

APR是從作業系統級别來解決異步的IO問題,大幅度的提高性能. (http://apr.apache.org/).
           

APR (Apache Portable Runtime) 是一個高可移植庫,它是 Apache HTTP Server 2.x 的核心。能更好地和其它本地 web 技術內建,總體上讓 Java 更有效率作為一個高性能 web 伺服器平台而不是簡單作為背景容器.

在産品環境中,特别是直接使用 Tomcat 做 WEB 伺服器的時候,應該使用 Tomcat Native 來提高其性能。如果不配 APR,基本上 300 個線程很快就會用滿,以後的請求就隻好等待。但是配上 APR 之後,并發的線程數量明顯下降,從原來的 300 可能會馬上下降到隻有幾十,新的請求會毫無阻塞的進來.

在區域網路環境測,就算是 400 個并發,也是一瞬間就處理 / 傳輸完畢,但是在真實的 Internet 環境下,頁面處理時間隻占 0.1% 都不到,絕大部分時間都用來頁面傳輸。如果不用 APR,一個線程同一時間隻能處理一個使用者,勢必會造成阻塞。是以生産環境下用 apr 是非常必要的.

安裝 Apache Tomcat Native Library,直接啟動就支援 apr ( http://tomcat.apache.org/native-doc/) 它本身是基于 APR 的。具體安裝方法可以參考其他部落格和文章。排除代碼問題 Tomcat 優化到這個層次,可以應對大部分性能需求.

最後一句話"再牛B的伺服器,也頂不住一個傻B的代碼".優化的前提條件是良好的代碼品質和設計.           

#挑戰30天在頭條寫日記#

點個關注吧!靓仔!

閑談 Tomcat 性能優化

繼續閱讀