1. 程式人生 > >Tomcat(JVM)效能調優

Tomcat(JVM)效能調優

Tomcat架構圖

    bubuko.com,布布扣

Tomcat與JVM版本優化
Tomcat的執行是基於Java的虛擬機器。SUN的JVM動態庫有client和server兩個版本,分別針對桌面應用和伺服器應用做了相應的優化,client版本載入速度較快,server版本載入速度較慢但執行起來較快。
在命令列輸入 java -version 可以看到jvm目前配置的是哪個版本。如果要修改jvm的版本,可更改預設java.exe呼叫的jvm.dll,這個由jvm.cfg決定。編輯%JAVA_HOME%/jre/lib/i386/jvm.cfg檔案,裡面第一行寫的是-client(預設就是client版本),把第二行的-server KNOWN 放到第一行, 如下所示:
-server KNOWN 
-client KNOWN 
-hotspot ALIASED_TO -client 
-classic WARN 
-native ERROR 
-green ERROR 
然後重啟tomcat,在命令列下輸入java -version ,就可以看到類似如下的資訊:
java version "1.6.0_13" 
Java(TM) SE Runtime Environment (build 1.6.0_13-b03 ) 
Java HotSpot(TM) Server VM (build 11.3-b02 , mixed mode)
表明Tomcat已經修改為使用Server版本的JVM,讀者可進行對比測試,對比一下Client版本的JVM和Server版本的效能差異,從而決定採用哪個版本的JVM。另外,也可以考慮更換其它廠商的JVM,例如Oracle的JRockit等。

Tomcat與記憶體洩漏
Tomcat 預設可以使用的記憶體為128MB(不同的版本有所區別),在較大型的應用專案中,這點記憶體是不夠的,需要調大,否則很容易出現“Out of Memery”的問題。 
在Windows 下,修改配置檔案 {tomcat_home}/bin/catalina.bat,在Linux/Unix 下,修改配置檔案 {tomcat_home}/bin/catalina.sh,增加如下設定:
JAVA_OPTS=‘-Xms 【初始化記憶體大小】 -Xmx 【可以使用的最大記憶體】‘
需要根據伺服器可用記憶體把這個兩個引數值調大。
另外,對於SUN的JVM,MaxPermSize引數的調整也比較重要。PermSize的大小決定了保持物件(類、方法)的大小。如果碰到“OutOfMemoryError: PermGen”的錯誤提示,應該考慮調整這個引數的大小。SUN JVM預設保留64MB作為PermSize大小。
關於Sun’s HotSpot JVM的其它與效能相關的調整引數,請讀者參考:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning

maxThreads - 連線執行緒數監控與調整
可通過修改Tomcat安裝目錄的Conf資料夾中的配置檔案server.xml檔案來調整Tomcat最大連線執行緒數。maxThreads是最大併發執行緒數,如果同時的併發請求量超過這個值,Tomcat也不會再增加執行緒,這時併發請求將進入佇列。增加maxThreads的值可以加大Tomcat的併發處理能力,但是設定過高的maxThreads值也會對效能帶來影響,佔有過多的系統資源,甚至造成Tomcat崩潰。
執行緒數可在Tomcat的Manager狀態頁面進行監控,如圖7.8所示:

圖7.8 監控Tomcat執行緒數
下面針對Tomcat7進行一些試驗,以說明maxThreads對於Tomcat伺服器效能的影響:
Tomcat堆記憶體設定為256M,用LoadRunner啟動50個虛擬使用者測試JpetStore主頁面(http://192.168.1.101:8080/jpetstore/shop/index.shtml),可得到以下測試結果:
(1)、預設配置maxThreads=200,平均事務響應時間:0.390
(2)、maxThreads=5,平均事務響應時間:0.355
(3)、maxThreads=50,平均事務響應時間:0.369
(4)、maxThreads=3,平均事務響應時間:0.559
可以看到,當maxThreads設定比較小時,Tomcat處理請求的速度有所下降。如果我們在測試指令碼中設定嚴格的併發(插入集合點lr_Rendezvous函式),可得到以下結果:
(1)、maxThreads=3,平均事務響應時間:2.609
(2)、maxThreads=50,平均事務響應時間:0.597
可以看到,在高強度的併發情況下,如果Tomcat的maxThreads值設定比較小,會嚴重影響效能,一般需要設定大於最大同時併發請求數。
注意:一般Web伺服器允許的最大連線數還受限制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。在CentOS 中可以用以下命令檢視Socket最大連線數:
ulimit -a
其中的open files是允許開啟的最大檔案數,CentOS預設是1024。
這個數值可通過修改vi /etc/security/limits.conf檔案來設定,例如修改為32768,可在檔案後新增:
* soft nofile 32768
* hard nofile 32768
儲存,重啟系統後就生效了。
為了證明這個Linux系統引數對Socket連線的影響,我們可以進行對比試驗,修改/etc/security/limits.conf:
* soft nofile 200
* hard nofile 200
在LoadRunner中啟動200個VU併發(設定集合點),在Controller的Connection和Connection per Second圖中看到連線數偏少(相比起預設設定的1024):
(1)、引數設定為200
平均事務響應時間:19.664
Connections:177.376
Connections per Second-New Connection:28.082
Connections per Second-Connection Shutdown:28.082
(2)、引數設定為1024(預設設定)
平均事務響應時間:2.712
Connections:315.136
Connections per Second-New Connection:114.000
Connections per Second-Connection Shutdown:114.000
在Socket連線建立受到限制的情況下,Tomcat的併發處理能力也受到明顯的影響,平均事務響應時間急劇上升。

connectionTimeout – 連線超時的設定
connectionTimeout是Connector從接受連線到提交URI的等待的時間(單位是毫秒),預設設定為60000(即60秒)。
這個設定在$tomcat/conf/server.xml中:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="2000" disableUploadTimeout="true" />
關於該項的詳細解釋和配置,讀者可參考tomcat幫助文件:
http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
connectionTimeout如果設定得比較小的話,可能造成大量使用者訪問網站時出現“502”異常。
connectionTimeout並不是指整個連線處理的時間,而是指從開始接受連線到開始處理請求的URI這段等待時間,讀者可以用telnet做個試驗來驗證:
直接用telnet連上tomcat,如果什麼都不輸入,socket很快會斷開,輸入完整的GET請求包,能夠獲得輸出(伺服器響應包)。如果不保持持續地輸入,則連線很快會斷開(如果connectionTimeout時間設定得比較小的話);如果一直不停輸入,連線會被繼續保持。
$ telnet localhost 8080

GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.11
Content-Length: 36

acceptCount - 最大排隊數的設定
acceptCount是指當所有執行緒都已經被用於處理請求時,允許多少新的連線請求進入排隊佇列等候處理,當佇列滿的時候,任何新的請求都將被拒絕。預設設定值為100。
配置例子如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="800" acceptCount="1000"/>
其中maxThreads是Tomcat啟動的最大執行緒數,即同時處理的任務個數,預設值為200,acceptCount是當Tomcat起動的執行緒數達到最大時,接受排隊的請求個數,預設值為100,這兩個值一起工作,可能出現下面三種情況:
情況1:接受一個請求,此時Tomcat啟動的執行緒數還沒有到達maxThreads設定的個數,Tomcat會啟動一個執行緒來處理此請求。
情況2:接受一個請求,此時Tomcat啟動的執行緒數已經到達maxThreads設定的個數,Tomcat會把此請求放入等待佇列,等待空閒執行緒可用。
情況3:接受一個請求,此時Tomcat啟動的執行緒數已經到達maxThreads設定的個數,而且等待佇列中的請求個數也達到了acceptCount設定的個數,此時Tomcat會直接拒絕此次請求,返回connection refused的錯誤。

Tomcat Native library(APR)的配置
所謂的Apache Tomcat Native library其實叫APR,全稱為:Apache Portable Runtime and Tomcat。可以通過下面地址訪問:
http://tomcat.apache.org/tomcat-5.5-doc/apr.html
Apache Tomcat Native library是Apache 為了提升 Tomcat 的效能開發的一套本地化 Socket、Thread、IO元件,也就是說它有高階 IO 功能, 作業系統級別的功能呼叫, 以及本地程序處理等等, 這些都能使Tomcat更像一個Web Server(像Apache那樣), 而不是隻能用來解釋JSP, 也就是說提升單獨的Tomcat作為伺服器的吞吐效能。
如果不配置Tomcat Native library,則啟動Tomcat時會提示:
2011-7-3 23:59:16 org.apache.catalina.core.AprLifecycleListener init
資訊: The APR based Apache Tomcat Native library which allows optimal performanc
e in production environments was not found on the java.library.path: E:\Program
Files\Java\jdk1.6.0_13\bin;.;E:\WINDOWS\Sun\Java\bin;E:\WINDOWS\system32;...
Linux下可用如下命令在Tomcat的日誌輸出檔案中檢視到上述提示:
head logs/catalina.out
下面介紹如何安裝和部署APR:
1、Windows下安裝APR
用於Windows的APR是一個名稱為:tcnative-1.dll 的檔案。可到下面網址下載匹配版本的tcnative-1.dll:
http://www.apache.org/dist/tomcat/tomcat-connectors/native/1.1.20/binaries/win32/
把下載的tcnative-1.dll檔案放到<$JAVA_HOME>/bin目錄下,啟動Tomcat就可以看到Tomcat已經載入部署了APR:
Loaded APR based Apache Tomcat Native library 1.1.20
2、Linux下安裝APR
(1)、安裝 APR
到http://apr.apache.org下載apr-1.2.12.tar.gz,然後用以下命令安裝:
tar -xvf apr-1.2.12.tar.gz
cd apr-1.2.12
./configure --prefix=/tomcat/apr
make
make install
(2)、安裝APR-UTIL
到http://apr.apache.org下載apr-util-1.2.12.tar.gz,然後用以下命令安裝:
tar -xvf apr-util-1.2.12.tar.gz
cd apr-util-1.2.12
./configure --prefix=/tomcat/apr --with-apr=/tomcat/apr
make
make install
(3)、安裝tomcat native library
cd /usr/local/tomcat/bin
tar zxvf tomcat-native.tar.gz
cd tomcat-native-1.1.10-src/jni/native
./configure --prefix=/tomcat/apr -- with-apr=/tomcat/apr –with-java-home=/usr/jdk
make
make install
(4)、編輯tomcat/bin/catalina.sh
將JAVA_OPTS="$CATALINA_OPTS -Djava.library.path= tomcat/apr/lib"
加在# ----- Execute The Requested Command -----------------------------------------前面
(5)、新增環境變數
# vi /etc/profile
新增:
export LD_LIBRARY_PATH=/usr/local/apr/lib
(6)、重啟Tomcat後,檢視Tomcat輸出日誌,可見APR成功載入了
# vim /usr/local/tomcat/logs/catalina.out

資訊: Loaded Apache Tomcat Native library 1.1.10.
2008-7-8 10:20:27 org.apache.catalina.core.AprLifecycleListener init
資訊: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2008-7-8 10:20:27 org.apache.coyote.http11.Http11AprProtocol init

Connector - 聯結器的配置
Tomcat從5.5版本開始,支援以下四種Connector的配置分別為:
(1)、NIO
NIO利用了APR提供的本地IO,能提升Tomcat的併發處理能力,配置例子如下所示:
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/>
(2)、HTTP
HTTP是Tomcat預設配置的聯結器,效能比較穩定,但是效率不是很高,配置的例子如下所示:
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443"/> 
(3)、tomcatThreadPool
tomcatThreadPool使用了執行緒池的技術,客戶端請求可重用執行緒池中的執行緒來處理,節省了重新分配執行緒的開銷,配置的例子如下所示:
<Connector executor="tomcatThreadPool"
port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
(4)、tomcatThreadPool + NIO
tomcatThreadPool可以組合NIO來提供服務,即在NIO的基礎上加入執行緒池,配置的例子如下所示:
<Connector executor="tomcatThreadPool"
port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
讀者可講Tomcat的聯結器分別按這四種方式配置,然後做一下對比測試,檢視一下效能的差異。
一般來說,第二種配置方式(HTTP)的效能會比較穩定,但是也是最差的,而這種方式是Tomcat的預設配置;第一種配置方式(NIO)的會有效能波動,但整體效率是比較高的;第三種配置方式(tomcatThreadPool)效能波動比較大;第四種配置方式(tomcatThreadPool + NIO)是在NIO的基礎上加入執行緒池,可能是程式處理更復雜了,因此效能不見得比NIO強。

相關推薦

TomcatJVM效能調

Tomcat架構圖      Tomcat與JVM版本優化 Tomcat的執行是基於Java的虛擬機器。SUN的JVM動態庫有client和server兩個版本,分別針對桌面應用和伺服器應用做了相應的優化,client版本載入速度較快,server版本載入速度較慢但

轉載效能調--永遠超乎想象 原文最終修訂於 2006-08-28 晚上11:48:38

未經博主同意轉載此部落格,如此好的部落格,後生只是看著心喜,便未經同意轉載,希望各位去原部落格閱讀:http://blog.csdn.net/rmartin/article/details/1132312 多年以前,我在開發一個C++的應用程式。我的同伴Jim Newk

TomcatJVM效能調總結

Tomcat效能調優:        找到Tomcat根目錄下的conf目錄,修改server.xml檔案的內容。對於這部分的調優,我所瞭解到的就是無非設定一下Tomcat伺服器的最大併發數和Tom

TomcatJVM效能調你真的學會了嗎?》總結篇

  Tomcat效能調優: 找到Tomcat根目錄下的conf目錄,修改server.xml檔案的內容。對於這部分的調優,我所瞭解到的就是無非設定一下Tomcat伺服器的最大併發數和Tomcat初始化時建立的執行緒數的設定,當然還有其他一些效能調優的設定,下圖是我根據我機子的效能設定的一些引數

深入理解Java虛擬機jvm性能調+內存模型+虛擬機原理視頻教程

boot operate 小型 spa clas padding ali restful left 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful 服務,並發原理編程,SpringBoot,Sp

深入理解Java虛擬機jvm性能調+內存模型+虛擬機原理

Java 課程大綱:第1節說在前面的話 00:05:07分鐘第2節整個部分要講的內容說明 00:06:58分鐘第3節環境搭建以及jdk,jre,jvm的關系 00:20:48分鐘第4節jvm初體驗-內存溢出問題的分析與解決 00:17:59分鐘第5節jvm再體驗-jvm可視化監控工具 00

JVM調常用調方案

由於Full GC的成本要遠遠高於Minor GC,因此儘可能的將物件分配在新生代是一項明智的選擇。 大部分情況下,jvm會嘗試在eden區域分配物件,但是因為空間緊張等問題,很可能不得不將部分年輕物件提前向老年代壓縮。因此,可以為程式分配一個合理的新生代空間,以最大限度避免新物件直接進入老年代的情

JVM實用引數記憶體調

原文地址,譯文地址,作者:PATRICK PESCHLOW,譯者:鄭旭東  校對:樑海艦 理想的情況下,一個Java程式使用JVM的預設設定也可以執行得很好,所以一般來說,沒有必要設定任何JVM引數。然而,由於一些效能問題(很不幸的是,這些問題經常出現),一些相關的JVM引數知識會是我們工作中

Spark十二--效能調

一段程式只能完成功能是沒有用的,只能能夠穩定、高效率地執行才是生成環境所需要的。 本篇記錄了Spark各個角度的調優技巧,以備不時之需。 一、配置引數的方式和觀察效能的方式 額。。。從最基本的開始講,可能一些剛接觸Spark的人不是很清楚Spark的一

Jvm效能調監控工具jps、jstack、jmap、jhat、jstat、hprof

現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ......     這些問題在日常開發中可能被很多人忽視

TomcatJVM監控方法轉帖

1、Tomcat自帶的監控頁面      配置詳見Tomcat安裝配置監控一文,如圖所示為監控頁面:                   2、Lo

JVM效能調

問題 & 目標 JVM問題:CPU load過高、請求延遲、TPS降低、記憶體洩漏 調優目標:使用較小的記憶體佔用獲得較高的吞吐量 或者 較低的延遲 調優指標: 記憶體佔用:程

mysql高階——sql調

小表驅動大表 使用in的sql:select * from A where id in (select id from B) 等價於: for select id from B for select * from A where

Tomcat修改service.xml效能調 增加最大併發連線數

 詳細配置: <Connector executor="tomcatThreadPool"                port="80" protocol="HTTP/1.1"                 connectionTimeout="20000"

5.JVM三大效能調引數:-Xms -Xmx -Xss

1.-Xss是對每個執行緒stack大小的調整。直接影響對方法的呼叫次數 測試結果: 測試程式碼: package com.dt.spark.jvm.basics; public class HelloStackOverFlow {private static int c

第5課:實戰演示JVM三大效能調引數:-Xms -Xmx -Xss

第3課: 1、應用程式是多執行緒的,多執行緒共享全域性共享記憶體空間,每個執行緒也有自己的記憶體空間, 執行緒與全域性共享記憶體空間怎麼互動呢? 執行緒如果要使用全域性共享變數,就將全域性共享變數拷貝過去,拷貝到執行緒的記憶體空間,交給執行緒的程式碼去處理,而不是直接去操

JVM解讀-效能調例項

JVM效能調優 1 堆設定調優 年輕代大小選擇 響應時間優先的應用:儘可能設大,直到接近系統的最低響應時間限制(

面試刷題32:你對tomcat做了哪些效能調

背景 java程式設計師的開發的java應用程式,一般都會選擇使用tomcat釋出,但是: 如何充分的掌控tomcat,並讓它發揮最優效能呢? 這也是面試的熱點問題,結合多年的工作實踐,我是李福春,今天總結一下。 tomcat的使用 下載 現在最新的穩定版本是tomcat9, 下載頁面:https://t

[jvm]五tomcat效能調效能監控visualvm

1、JDK記憶體優化 根據伺服器物理內容情況配置相關引數優化tomcat效能。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此一般建議堆的最大值設定為可用記憶體的最大值的80%。 Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,

jvm系列(五):tomcat效能調效能監控visualvm

tomcat伺服器優化 1、JDK記憶體優化    根據伺服器物理內容情況配置相關引數優化tomcat效能。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此一般建議堆的最大值設定為可用記憶體的最大值的80%。 Tomcat預設可以使用的記憶體為128MB,在較大