【Tomcat】Tomcat性能分析

1、預研任務介紹和預研目標

任務介紹:html

Apache Tomcat是目前較爲流行的web服務器,以其技術先進、性能穩定著稱,其次它仍是一個免費開源的項目。java

Tomcat性能分析的意義在於能爲平常工做中的一些內存泄露和tomcat crash問題提供參考,本文主要經過一些工具的使用和一些參數的講解,穿插分析tomcat性能。linux

預研目標:web

經過壓力測試以及性能檢測工具監控,分析tomcat的性能,並作相應的調優操做。spring

2、操做步驟

(0)假如測試的併發數過大,請預先對tomcat的maxThreads選項進行設置;數據庫

1)部署測試對象apache

以供電局需求側分析項目做爲web壓力測試對象,在其web.xml中將spring security的過濾器模塊註釋掉,並將其部署上tomcat7.0緩存

測試是否成功去除spring security攔截,在頁面輸入http://localhost:8080/DSM/index.jsp,如圖1則表示操做成功。tomcat

 

 

去除攔截後直接越過登陸檢測登入系統服務器

 

dosh下輸入JVisualVM [1],開啓tomcat性能監控。

至此測試對象已經部署完畢。

 

(2)使用http_load [2]進行壓力測試 

http://localhost:8080/DSM/index.jsp
http://localhost:8080/DSM/rest/CommunicatManagement/NoticeboardManagement/NoticeboardViewer?_dc=1376059585323&searchString=&datetimeArray=&page=1&start=0&limit=20
http://localhost:8080/DSM/rest/CommunicatManagement/WorkflowManagement/WorkflowViewer/WorkflowViewer?_dc=1376059701735&searchString=&page=1&start=0&limit=20
http://localhost:8080/DSM/rest/CommunicatManagement/GuestbookManagement/GuestbookViewer?_dc=1376059728941&searchString=&datetimeArray=&page=1&start=0&limit=12
http://localhost:8080/DSM/rest/CommunicatManagement/PowerCutManagement/PowerCutViewerService?_dc=1376059750417&searchString=&datetimeArray=&page=1&start=0&limit=20

在當前目錄創建url.txt,內容如上面所示。url.txt內容的意義在於模仿用戶進入主界面而後對通訊管理模塊的全部功能進行並行訪問。至於這些url如何獲取出來用於測試,你能夠用ChromeDeveloper Tools或者FirefoxFireBug進行獲取。

http_load -p 50 -s 600 url.txt

dosh下輸入如上所示的命令,該命令使用http_loadurl.txt中包含的全部url進行併發數爲50、爲期600秒的壓力測試,承受這個壓力的便是咱們部署的在tomcat上的項目,因此文章雖然叫tomcat分析,但實質也是在對咱們的程序進行性能分析。這個時候你能夠泡杯茶、散散步靜待10分鐘的結束,JVisualVM已經在後臺默默的工做中了。

 

3)數據分析

複製代碼
8559 fetches, 50 max parallel, 2.95904e+07 bytes, in 600 seconds
3457.23 mean bytes/connection
14.265 fetches/sec, 49317.4 bytes/sec
msecs/connect: 0.0851023 mean, 0.341 max, 0.015 min
msecs/first-response: 3458.08 mean, 26924.7 max, 0.225 min
991 bad byte counts
HTTP response codes:
  code 200 -- 7568
  code 500 -- 991
複製代碼

10分鐘到了,在dosh下截獲如上所示的壓力測試報告。第1行關注其產生了8559個請求,最大併發數爲50;第3行關注其每秒處理的請求數爲14;第4行關注到每次鏈接(url裏面的內容被處理一次稱爲一次鏈接)的平均毫秒爲0.0851023(效率高的可怕,這是hibernate的緩存在發揮做用);最後一行咱們看到有991條請求當掉了,說明咱們的程序性能仍是有必定的問題。後臺報的錯誤主要是oracle數據庫鏈接錯誤,這代表咱們的數據庫鏈接池存在必定的問題,須要進一步進行優化。

然而僅憑這些數據,咱們還得不出什麼直觀的性能分析結果,照目前來講,只能算還正常。進一步地,咱們須要配合jvisualvm進行分析。

 

4jvisualvm分析

 

2 CPU變化圖

 

由圖片能夠得出,簡單的壓力測試中CPU的最大佔有率達到19%左右,測試環境是在個人我的PC機(I5CPU)上,可見併發對CPU的壓力仍是很大的。峯值以後的曲線仍是比較平緩的,這是CPU的調度能力發揮了做用。假如是對服務器作併發測試的話,這個數據就顯得很是重要了。

 

佔用CPU最大的三個方法

 

Tomcat服務器自帶的任務調度和oracle數據庫鏈接佔據了最大的CPU,可見咱們的主要壓力都做用在了oracletomcat上了。

 

堆內存變化圖

 

堆內存中,最大的使用內存才達到414M左右,可見併發對內存的要求不高。曲線很是祕密的那一塊說明發生了頻繁的產生對象和垃圾回收,JVMGC仍是很是強大的,它一直在背後默默的回收垃圾。除了峯值參考,曲線的另外一個意義在於,觀察上升和降低的幅度是否大抵一致,如若一直上漲,就有多是程序出了問題,例如某個for循環寫錯了,這個時候就會報java.lang.OutOfMemoryError: Java heap space錯誤。

 

持久代內存變化圖

 

持久代的內存徹底沒有波動,說明咱們沒有發生內存溢出(通常內存溢出都是這裏發生的)。爲何通常的內存溢出會發生在這裏?PermGen [3]意爲permanent generation,即持久代(年老代),程序頻繁的讀/寫數據庫將會對這一層形成極大壓力,溢出後會報java.lang.OutOfMemoryError: PermGen space錯誤。

 

佔用內存最大的三個類

 

這裏咱們能夠得出,字符串類型的操做以及IO讀寫在壓力測試中是發生得最平凡的。

 

5參數調優 [4]和數據庫鏈接池調優

假如你是window 32/64bit,請在tomcat_home/bin下新建setenv.bat並輸入如下內容:

set JAVA_OPTS=%JAVA_OPTS%
-Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled

假如你是linux 32/64bit,請在tomcat_home/bin下新建setenv.sh並輸入如下內容:

export JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-Djava.awt.headless=true"

假如你是以eclipse啓動tomcat,請在其vm arguments添加以下內容:

-Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-Djava.awt.headless=true

下面對全部參數進行一一解釋:

  • -Xms1024m 初始化堆的大小
  • -Xmx2048m 堆的最大值(最大設置爲內存值的80%
  • -XX:PermSize=32m 初始化持久代內存大小
  • -XX:MaxPermSize=512m 最大持久代內存大小
  • -Xss2m 方法棧內存大小
  • -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 啓用並行垃圾收集器
  • -Djava.awt.headless=true 爲了避免影響linux圖形化效果,咱們能夠添加這個參數

另外,若是你要爲你的orcale數據庫添加unicode默認支持,則加入以下參數:

-Doracle.jdbc.defaultNChar=true

 下一步,咱們須要對數據庫鏈接池進行調優:

複製代碼
<!--配置apache dbcp數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url"
        value="jdbc:oracle:thin:@192.168.0.3:1520:NIKEY" />
    <property name="username" value="PHOENIX" />
    <property name="password" value="123456" />
    <!-- 鏈接池啓動時的初始值 -->
    <property name="initialSize" value="50" />
    <!-- 鏈接池的最大值 -->
    <property name="maxActive" value="100" />
    <!-- 最大空閒值.當通過一個高峯時間後,鏈接池能夠慢慢將已經用不到的鏈接慢慢釋放一部分,一直減小到maxIdle爲止 -->
    <property name="maxIdle" value="10" />
    <!-- 最小空閒值.當空閒的鏈接數少於閥值時,鏈接池就會預申請去一些鏈接,以避免洪峯來時來不及申請 -->
    <property name="minIdle" value="5" />
</bean>
複製代碼

備註:所需jar包:commons-dbcp.jar & commons-pool.jar & commons-logging.jar

 

6)再測試

使用上面一樣的壓力測試語句http_load -p 50 -s 600 url.txt,靜待10分鐘結束。

複製代碼
54995 fetches, 50 max parallel, 1.32363e+08 bytes, in 600 seconds
2406.83 mean bytes/connection
91.6583 fetches/sec, 220606 bytes/sec
msecs/connect: 0.0579369 mean, 0.308 max, 0.013 min
msecs/first-response: 544.293 mean, 6322.84 max, 0.111 min
HTTP response codes:
  code 200 -- 54995
複製代碼

54995多個請求所有成功,一秒處理91個請求,每一個鏈接的平均時間爲0.05豪秒,效率當即體現出來了。

再看CPU/內存使用圖以下:

 

堆內存變化圖

 

7 CPU變化圖

CPU的變化最大不超過20%,然而調優後須要考慮到因爲程序能處理更多的併發,那麼也會拉長GC的回收時間,那你所須要注意的是就是這麼長的時間裏峯值會達到多少,應該在參數配置中予以考慮。

 

7)總結

Tomcat的性能足以承受咱們平常工做的併發操做,可是須要配置調優參數以防止撐爆,而且爲了提升數據庫交互的效率咱們最好使用鏈接池技術。

3、參考文獻

[1] Java自帶的GUI性能監控工具Jconsole以及JisualVM簡介

[2] Linuxhttp_load使用簡介

[3] JVM調優總結(十)-調優方法

[4] JVM 幾個重要的參數 & Java HotSpot VM Options & Java 6 JVM參數選項大全(中文版)

 

 

 

 

1、預研任務介紹和預研目標

任務介紹:

Apache Tomcat是目前較爲流行的web服務器,以其技術先進、性能穩定著稱,其次它仍是一個免費開源的項目。

Tomcat性能分析的意義在於能爲平常工做中的一些內存泄露和tomcat crash問題提供參考,本文主要經過一些工具的使用和一些參數的講解,穿插分析tomcat性能。

預研目標:

經過壓力測試以及性能檢測工具監控,分析tomcat的性能,並作相應的調優操做。

2、操做步驟

(0)假如測試的併發數過大,請預先對tomcat的maxThreads選項進行設置;

1)部署測試對象

以供電局需求側分析項目做爲web壓力測試對象,在其web.xml中將spring security的過濾器模塊註釋掉,並將其部署上tomcat7.0

測試是否成功去除spring security攔截,在頁面輸入http://localhost:8080/DSM/index.jsp,如圖1則表示操做成功。

 

 

去除攔截後直接越過登陸檢測登入系統

 

dosh下輸入JVisualVM [1],開啓tomcat性能監控。

至此測試對象已經部署完畢。

 

(2)使用http_load [2]進行壓力測試 

http://localhost:8080/DSM/index.jsp
http://localhost:8080/DSM/rest/CommunicatManagement/NoticeboardManagement/NoticeboardViewer?_dc=1376059585323&searchString=&datetimeArray=&page=1&start=0&limit=20
http://localhost:8080/DSM/rest/CommunicatManagement/WorkflowManagement/WorkflowViewer/WorkflowViewer?_dc=1376059701735&searchString=&page=1&start=0&limit=20
http://localhost:8080/DSM/rest/CommunicatManagement/GuestbookManagement/GuestbookViewer?_dc=1376059728941&searchString=&datetimeArray=&page=1&start=0&limit=12
http://localhost:8080/DSM/rest/CommunicatManagement/PowerCutManagement/PowerCutViewerService?_dc=1376059750417&searchString=&datetimeArray=&page=1&start=0&limit=20

在當前目錄創建url.txt,內容如上面所示。url.txt內容的意義在於模仿用戶進入主界面而後對通訊管理模塊的全部功能進行並行訪問。至於這些url如何獲取出來用於測試,你能夠用ChromeDeveloper Tools或者FirefoxFireBug進行獲取。

http_load -p 50 -s 600 url.txt

dosh下輸入如上所示的命令,該命令使用http_loadurl.txt中包含的全部url進行併發數爲50、爲期600秒的壓力測試,承受這個壓力的便是咱們部署的在tomcat上的項目,因此文章雖然叫tomcat分析,但實質也是在對咱們的程序進行性能分析。這個時候你能夠泡杯茶、散散步靜待10分鐘的結束,JVisualVM已經在後臺默默的工做中了。

 

3)數據分析

複製代碼
8559 fetches, 50 max parallel, 2.95904e+07 bytes, in 600 seconds
3457.23 mean bytes/connection
14.265 fetches/sec, 49317.4 bytes/sec
msecs/connect: 0.0851023 mean, 0.341 max, 0.015 min
msecs/first-response: 3458.08 mean, 26924.7 max, 0.225 min
991 bad byte counts
HTTP response codes:
  code 200 -- 7568
  code 500 -- 991
複製代碼

10分鐘到了,在dosh下截獲如上所示的壓力測試報告。第1行關注其產生了8559個請求,最大併發數爲50;第3行關注其每秒處理的請求數爲14;第4行關注到每次鏈接(url裏面的內容被處理一次稱爲一次鏈接)的平均毫秒爲0.0851023(效率高的可怕,這是hibernate的緩存在發揮做用);最後一行咱們看到有991條請求當掉了,說明咱們的程序性能仍是有必定的問題。後臺報的錯誤主要是oracle數據庫鏈接錯誤,這代表咱們的數據庫鏈接池存在必定的問題,須要進一步進行優化。

然而僅憑這些數據,咱們還得不出什麼直觀的性能分析結果,照目前來講,只能算還正常。進一步地,咱們須要配合jvisualvm進行分析。

 

4jvisualvm分析

 

2 CPU變化圖

 

由圖片能夠得出,簡單的壓力測試中CPU的最大佔有率達到19%左右,測試環境是在個人我的PC機(I5CPU)上,可見併發對CPU的壓力仍是很大的。峯值以後的曲線仍是比較平緩的,這是CPU的調度能力發揮了做用。假如是對服務器作併發測試的話,這個數據就顯得很是重要了。

 

佔用CPU最大的三個方法

 

Tomcat服務器自帶的任務調度和oracle數據庫鏈接佔據了最大的CPU,可見咱們的主要壓力都做用在了oracletomcat上了。

 

堆內存變化圖

 

堆內存中,最大的使用內存才達到414M左右,可見併發對內存的要求不高。曲線很是祕密的那一塊說明發生了頻繁的產生對象和垃圾回收,JVMGC仍是很是強大的,它一直在背後默默的回收垃圾。除了峯值參考,曲線的另外一個意義在於,觀察上升和降低的幅度是否大抵一致,如若一直上漲,就有多是程序出了問題,例如某個for循環寫錯了,這個時候就會報java.lang.OutOfMemoryError: Java heap space錯誤。

 

持久代內存變化圖

 

持久代的內存徹底沒有波動,說明咱們沒有發生內存溢出(通常內存溢出都是這裏發生的)。爲何通常的內存溢出會發生在這裏?PermGen [3]意爲permanent generation,即持久代(年老代),程序頻繁的讀/寫數據庫將會對這一層形成極大壓力,溢出後會報java.lang.OutOfMemoryError: PermGen space錯誤。

 

佔用內存最大的三個類

 

這裏咱們能夠得出,字符串類型的操做以及IO讀寫在壓力測試中是發生得最平凡的。

 

5參數調優 [4]和數據庫鏈接池調優

假如你是window 32/64bit,請在tomcat_home/bin下新建setenv.bat並輸入如下內容:

set JAVA_OPTS=%JAVA_OPTS%
-Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled

假如你是linux 32/64bit,請在tomcat_home/bin下新建setenv.sh並輸入如下內容:

export JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-Djava.awt.headless=true"

假如你是以eclipse啓動tomcat,請在其vm arguments添加以下內容:

-Xms1024m -Xmx2048m -XX:PermSize=32m
-XX:MaxPermSize=512m -Xss2m -XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-Djava.awt.headless=true

下面對全部參數進行一一解釋:

  • -Xms1024m 初始化堆的大小
  • -Xmx2048m 堆的最大值(最大設置爲內存值的80%
  • -XX:PermSize=32m 初始化持久代內存大小
  • -XX:MaxPermSize=512m 最大持久代內存大小
  • -Xss2m 方法棧內存大小
  • -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 啓用並行垃圾收集器
  • -Djava.awt.headless=true 爲了避免影響linux圖形化效果,咱們能夠添加這個參數

另外,若是你要爲你的orcale數據庫添加unicode默認支持,則加入以下參數:

-Doracle.jdbc.defaultNChar=true

 下一步,咱們須要對數據庫鏈接池進行調優:

複製代碼
<!--配置apache dbcp數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url"
        value="jdbc:oracle:thin:@192.168.0.3:1520:NIKEY" />
    <property name="username" value="PHOENIX" />
    <property name="password" value="123456" />
    <!-- 鏈接池啓動時的初始值 -->
    <property name="initialSize" value="50" />
    <!-- 鏈接池的最大值 -->
    <property name="maxActive" value="100" />
    <!-- 最大空閒值.當通過一個高峯時間後,鏈接池能夠慢慢將已經用不到的鏈接慢慢釋放一部分,一直減小到maxIdle爲止 -->
    <property name="maxIdle" value="10" />
    <!-- 最小空閒值.當空閒的鏈接數少於閥值時,鏈接池就會預申請去一些鏈接,以避免洪峯來時來不及申請 -->
    <property name="minIdle" value="5" />
</bean>
複製代碼

備註:所需jar包:commons-dbcp.jar & commons-pool.jar & commons-logging.jar

 

6)再測試

使用上面一樣的壓力測試語句http_load -p 50 -s 600 url.txt,靜待10分鐘結束。

複製代碼
54995 fetches, 50 max parallel, 1.32363e+08 bytes, in 600 seconds
2406.83 mean bytes/connection
91.6583 fetches/sec, 220606 bytes/sec
msecs/connect: 0.0579369 mean, 0.308 max, 0.013 min
msecs/first-response: 544.293 mean, 6322.84 max, 0.111 min
HTTP response codes:
  code 200 -- 54995
複製代碼

54995多個請求所有成功,一秒處理91個請求,每一個鏈接的平均時間爲0.05豪秒,效率當即體現出來了。

再看CPU/內存使用圖以下:

 

堆內存變化圖

 

7 CPU變化圖

CPU的變化最大不超過20%,然而調優後須要考慮到因爲程序能處理更多的併發,那麼也會拉長GC的回收時間,那你所須要注意的是就是這麼長的時間裏峯值會達到多少,應該在參數配置中予以考慮。

 

7)總結

Tomcat的性能足以承受咱們平常工做的併發操做,可是須要配置調優參數以防止撐爆,而且爲了提升數據庫交互的效率咱們最好使用鏈接池技術。

3、參考文獻

[1] Java自帶的GUI性能監控工具Jconsole以及JisualVM簡介

[2] Linuxhttp_load使用簡介

[3] JVM調優總結(十)-調優方法

[4] JVM 幾個重要的參數 & Java HotSpot VM Options & Java 6 JVM參數選項大全(中文版)

相關文章
相關標籤/搜索