tomcat7性能調優指導書

注意:調優tomcat須要瞭解使用的tomcat是什麼版本,隨着tomcat版本發展有新參數引入,同時有舊參數廢棄。本文檔以tomcat7爲例進行調優javascript

一. 線程池(Thread Pool)優化css

編輯「Tomcat安裝目錄/conf/server.xml」文件,找到以下內容html

<!--java

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"web

        maxThreads="150" minSpareThreads="4"/>shell

-->apache

 

 

 

 

 

取消註釋,參數作以下調整windows

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"瀏覽器

        maxThreads="1000" minSpareThreads="25"        tomcat

        maxIdleTime="600000" acceptCount="500"/>

 

 

 

 

參數說明

name        這個是線程池的名字,必須惟一,默認便可,咱們在後面的配置裏要用到這個東西
namePrefix    線程的名字前綴,用來標記線程名字的,這樣每一個線程就用這個前綴加上線程編號了,好比 catalina-exec-1 catalina-exec-2
maxThreads    線程池能夠容納的最大線程數,tomcat使用線程來處理接收的請求每個線程處理一個請求,這個值決定了同時可以處理的最大請求數,缺省值爲200
minSpareThreads 最小的保持活躍的線程數量,缺省值爲4(tomcat5有此參數,而tomcat6無此參數,到了tomcat7又從新使用此參數,順便提下5和7中這兩個參數含義並不相同有興趣能夠查看官方文檔)
maxIdleTime   關閉一個空閒線程以前容許空閒線程持續的時間,只有當前空閒線程數大於minSpareThread的值,纔會關閉空閒線程
acceptCount   當全部可用的請求處理線程都被使用的時候,鏈接請求隊列的最大長度。當該隊列滿了之後的全部請求都被拒絕,缺省值爲10

順便提下以下3個參數maxSpareThreads、maxProcessors和minProcessors

maxSpareThreads:容許存在的空閒線程的最大數量,tomcat5及之前版本纔有的參數,tomcat6和tomcat7均無此參數
minProcessors:最小空閒鏈接線程數,用於提升系統處理性能
maxProcessors:最大鏈接線程數,即併發處理的最大請求數
maxProcessors和minProcessors是tomcat4纔有的,tomcat5以後的版本均取消了這2個參數,tomcat4基本無人在用了吧,因此優化的時候別再把這2個參數加上了

 

 

 

 

 

二. 鏈接器(Connector)優化

編輯「Tomcat安裝目錄/conf/server.xml」文件,找到以下內容將其註釋掉

<Connector port="80" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="8443" />

 

 

 

 

再找到以下內容,取消註釋

<!--

<Connector executor="tomcatThreadPool"

       port="8080" protocol="HTTP/1.1"

       connectionTimeout="20000"

       redirectPort="8443" />

-->

 

 

 

 

 

 

 

參數作以下調整

<Connector executor="tomcatThreadPool"

       port="8080" protocol="HTTP/1.1"

       URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"

       connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"

       useURIValidationHack="false" compression="on" compressionMinSize="2048"

       compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

       redirectPort="8443"/>

 

 

 

 

 

 

 

 

AJP/1.3協議負責和其餘HTTP服務器創建鏈接,監聽的是8009端口,好比tomcat和apache或者iis集成時使用這個鏈接器,此時則需優化8009端口的Connector。

<!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8009" protocol="AJP/1.3"

            URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"

            connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"

            useURIValidationHack="false" compression="on" compressionMinSize="2048"

            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

            redirectPort="8443" />

 

 

 

 

 

 

 

 

參數說明:

executor="tomcatThreadPool" 在 Connector裏指定使用共享線程池的名稱
port="8080" 指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求
protocol="HTTP/1.1" 負責創建HTTP鏈接,web應用經過瀏覽器訪問tomcat服務器用的就是這個鏈接器,默認監聽的是8080端口。因此咱們優化的是8080端口的Connector
URIEncoding="UTF-8" URI解碼所使用的字符集,隻影響GET請求的URI解碼,不影響post的解碼
enableLookups="false" 禁用DNS查詢,默認值爲true,爲了提升處理能力應設置爲false
disableUploadTimeout="true" 容許servlet container在一個servlet執行的時候,使用一個不一樣的,更長的鏈接超時。最終的結果是給servlet更長的時間以便完成其執行,或者在數據上載的時候更長的超時時間。若是沒有指定默認爲false
connectionTimeout="20000" 在Connector接受一個鏈接之後,等待發生第一個請求的時間,單位毫秒。缺省值爲60000(60秒)
keepAliveTimeout="15000" 在一個長鏈接中2次請求之間的最大間隔時間,超過此時間鏈接斷開,單位毫秒
maxKeepAliveRequests="1000" 在server關閉鏈接以前,接受的HTTP請求的最大數目。若是該值設爲1,會禁止HTTP/1.0保活,同時也會禁止HTTP/1.1保活和pipelining。若是沒有指定默認值100。
useURIValidationHack="false" 減小它對一些url的沒必要要的檢查從而減省開銷
compression="on" 設爲on開啓Connector使用HTTP/1.1的GZIP壓縮,可節省服務器帶寬
compressionMinSize="2048" 啓用壓縮的輸出內容大小,這裏面設置爲2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 壓縮文件的類型
redirectPort="8443" 若是Connector支持非SSL請求,在收到一個要求使用SSL傳輸的請求之後,Catalina會自動將該請求重定向到這裏指定的端口號

三. JAVA虛擬機(JVM)優化

注意調優JVM須要瞭解使用的JDK是什麼版本,隨着JDK版本發展有新參數引入,同時有舊參數廢棄。本文檔以JDK7爲例進行調優

下圖爲JDK7及以前老JDK版本的JVM內存結構圖,優化JVM前必須清楚它的內存結構,有興趣能夠多查資料瞭解,在此不作過多描述。

 

JDK7的JVM內存由Heap(堆空間)和Perm(持久代)組成. 其中Heap = {Old + young = { Eden , from, to } }

JDK8的JVM已經將Perm(持久代)從內存空間移除

Linux平臺,編輯「Tomcat安裝目錄/conf/catalina.sh」文件,該文件開頭是一大段由#包裹的註釋,在註釋的最後添加以下內容

export JAVA_OPTS="-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true" 

 

 

 

 

 

 

若是想要打印JVM運行日誌信息,則能夠再添加以下參數,-Xloggs指定日誌路徑

-Xloggc:/path/jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails

 

 

 

Windows平臺,則編輯「Tomcat安裝目錄/conf/catalina.bat」文件

set JAVA_OPTS=-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true

 

 

 

 

 

若是想要打印JVM運行日誌信息,則能夠再添加以下參數,-Xloggs指定日誌路徑

-Xloggc:D:\path\jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails

 

 

 

參數說明:

-server 指定JAVA虛擬機運行在server模式
-Xms 初始Heap內存大小,本文檔設置了3G,須要結合服務器CPU核數,內存總量等實際狀況來設置合適數值,此值並不是越大越好,過大將增長垃圾回收的壓力
-Xmx 最大Heap內存大小,本文檔設置了3G,須要結合服務器CPU核數,內存總量等實際狀況來設置合適數值,此值並不是越大越好,過大將增長垃圾回收的壓力
-Xmn 新生代內存大小
-Xss 每一個線程的堆棧大小
-XX:+AggressiveOpts 啓用JVM開發團隊最新的調優成果,例如:編譯優化,偏向鎖,並行老年代收集,JDK5.6後引入,JDK6默認開啓
-XX:+UseBiasedLocking 啓用一個優化了的線程鎖(偏向鎖),JDK5.6後引入,JDK6默認開啓
-XX:PermSize 初始持久代內存大小,須要注意永久代在JDK8中被徹底的移除了,永久代的參數-XX:PermSize和-XX:MaxPermSize也被移除了
-XX:MaxPermSize 最大持久代內存大小,須要注意永久代在JDK8中被徹底的移除了,永久代的參數-XX:PermSize和-XX:MaxPermSize也被移除了
-XX:+DisableExplicitGC 禁止顯示的調用System.gc()方法進行GC
-XX:+UseConcMarkSweepGC 使用併發標記清除(CMS)垃圾收集器 它是對年老代進行垃圾收集的。CMS收集器經過多線程併發進行垃圾回收,儘可能減小垃圾收集形成的停頓。採用這種垃圾收集器默認會開啓-XX:+UseParNewGC參數對新生代使用Parallel GC(並行垃圾回收器)
-XX:+UseParNewGC 新生代使用Parallel GC(並行垃圾回收器),若是老年代使用了CMS垃圾回收期,則新生代默認就是這種垃圾回收器
-XX:+CMSParallelRemarkEnabled CMS垃圾回收器回收對象時,應用有2次停頓,第一次是初始標記,第二次是從新標記,開啓並行remark能夠下降從新標記停頓時間,
-XX:+UseCMSCompactAtFullCollection CMS不會整理堆碎片,爲了防止堆碎片引發full gc,設置此參數使CMS垃圾回收時進行合併碎片,開啓這個選項必定程度上會影響性能
-XX:CMSMaxAbortablePrecleanTime
-XX:+CMSClassUnloadingEnabled 開啓CMS回收持久代,避免Perm區滿引發的full gc
-XX:LargePageSizeInBytes 指定Java heap的分頁頁面大小
-XX:+UseFastAccessorMethods 將get(),set()方法轉成本地代碼,默認開啓
-XX:+UseCMSInitiatingOccupancyOnly 只有達到-XX:CMSInitiatingOccupancyFraction指定的使用百分比才進行老年代的垃圾回收
-XX:CMSInitiatingOccupancyFraction 指定老年代在使用了多少百分比空間時開始進行垃圾回收,JDK5默認68%,JDK6默認92%
-Djava.awt.headless 解決J2EE工程中的圖表工具在Linux/Unix環境下會致使圖片顯示不出來
-Xloggc 指定JVM日誌輸出到文件
-XX:+PrintGCDateStamps 打印GC發生的時間,JDK6和JDK7才支持,若是是JDK5請使用-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime 打印GC形成應用停頓的時間
-XX:+PrintGCApplicationConcurrentTime 打印GC時應用併發執行的時間
-XX:+PrintGCDetails 打印GC詳細信息

四. 調整Tomcat Connector的運行模式

首先大體瞭解Tomcat Connector的三種運行模式:bio、nio和apr

bio

bio(blocking I/O),顧名思義,即阻塞式I/O操做,表示Tomcat使用的是傳統的Java I/O操做(即java.io包及其子包)。Tomcat在默認狀況下,就是以bio模式運行的。遺憾的是,就通常而言,bio模式是三種運行模式中性能最低的一種。咱們能夠經過Tomcat Manager來查看服務器的當前狀態。

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變成了

apr

apr(Apache Portable Runtime/Apache可移植運行時),是Apache HTTP服務器的支持庫。你能夠簡單地理解爲,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,從而大大地提升Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高併發應用的首選模式。若是咱們的Tomcat不是在apr模式下運行,在啓動Tomcat的時候,咱們能夠在日誌信息中看到相似以下信息:

2015-12-13 16:17:49 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庫]

Tomcat6.x從6.0.32開始以及Tomcat7.x從7.0.30開始,Windows版的Tomcat已經在bin目錄下自帶了tcnative-1.dll等文件,而且啓動後默認就運行在apr模式下,所以對於Windows操做系統咱們只須要下載最新版本的Tomcat直接使用便可。而Linux版的Tomcat在bin目錄下自帶的是tomcat-native.tar.gz,這個包是須要和APR庫一塊兒編譯安裝後才能使用的。

 
APR安裝方式
在Window下安裝(Tomcat7.0.30以前版本才須要安裝)
1. 首先下載最新版本的tcnative-1.dll, 下載地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/
 
2. 本文檔下載的文件是tomcat-native-1.2.2-win32-bin.zip,解壓縮獲得32bit和64bit2個tcnative-1.dll,根據實際操做系統位數將相應的tcnative-1.dll拷貝到TOMCAT_HOME/bin目錄下,啓動便可
 
3. 驗證是否啓動
看見相似這樣的信息就證實 apr 已啓動
2015-12-13 15:17:05 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded APR based Apache Tomcat Native library 1.1.20.
2015-12-13 15:17:05 org.apache.catalina.core.AprLifecycleListener init
信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2015-12-13 15:17:05 org.apache.coyote.http11.Http11AprProtocol init









在Linux下安裝
1. 下載所需的包
apr/apr-iconv/apr-util的下載路徑:http://apr.apache.org/download.cgi
本文檔下載的是軟件是以下版本
apr-1.5.2.tar.gz
apr-iconv-1.2.1.tar.gz
apr-util-1.5.4.tar.gz
 
tomcat-native下載路徑:http://archive.apache.org/dist/tomcat/tomcat-connectors/native
本文檔下載的是tomcat-native-1.2.2-src.tar.gz,若是是Tomcat7.0.30以後的版本也可到tomcat安裝目錄的bin下面找tomcat-native.tar.gz  
 
2. 安裝apr
tar zxvf apr-1.5.2.tar
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make
make install








 
 
3. 安裝apr-iconv
tar -zxvf apr-iconv-1.2.1.tar.gz
cd apr-iconv-1.2.1
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make
make install


 
 
 
 
 
 
 
4. 安裝apr-util
tar zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make
make install





 
 
 
5. 安裝tomcat-native
注意:安裝以前請檢查openssl-devel是否安裝,由於編譯的時候添加了--with-ssl=yes選項,此選項須要openssl-devel支持,配好yum源經過yum install openssl-devel安裝,固然若是不加這個選項也可不裝openssl-devel。
 
tar zxvf tomcat-native-1.2.2-src.tar.gz
cd tomcat-native-1.2.2-src/native
(如版本是t
omcat-native-1.1.x-src.tar.gz 則路徑是tomcat-native-1.1.x-src/jni/native)
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.7.0_80 --with-ssl=yes
make
make install
 
 
 
 
 
 
 
 
 
6. 添加環境變量
編輯/etc/profile 在文件末尾處添加下面的變量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib   
而後執行下面命令,使環境變量即時生效
source /etc/profile
 
或者修改tomcat啓動腳本catalina.sh/cactalina.bat
在文件中加入啓動參數:
    JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
或者:
    CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib"
 
注意若是是windows平臺請不要添加雙引號。
 
6. 驗證
看到相似這樣的信息就證實 apr 啓動成功了。
Jul 20, 2011 15:27:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.



 也能夠經過Tomcat Manager來查看服務器的當前狀態
 
五 後記
本着嚴謹的態度想將這篇文檔儘可能向嚴謹靠攏,但本人水平有限,文中不妥之處還請讀者留言斧正不勝感激!如能給讀者帶來幫助也不枉我寫做此文檔,須要申明本文檔第四節參考引用了以下2篇博文在此一併對博主表示感謝。
http://www.365mini.com/page/tomcat-connector-mode.htm
http://pengranxiang.iteye.com/blog/1128905
相關文章
相關標籤/搜索