任務介紹:html
Apache Tomcat是目前較爲流行的web服務器,以其技術先進、性能穩定著稱,其次它仍是一個免費開源的項目。java
Tomcat性能分析的意義在於能爲平常工做中的一些內存泄露和tomcat crash問題提供參考,本文主要經過一些工具的使用和一些參數的講解,穿插分析tomcat性能。linux
預研目標:web
經過壓力測試以及性能檢測工具監控,分析tomcat的性能,並作相應的調優操做。spring
(0)假如測試的併發數過大,請預先對tomcat的maxThreads選項進行設置;數據庫
(1)部署測試對象apache
以供電局需求側分析項目做爲web壓力測試對象,在其web.xml中將spring security的過濾器模塊註釋掉,並將其部署上tomcat7.0。緩存
測試是否成功去除spring security攔截,在頁面輸入http://localhost:8080/DSM/index.jsp,如圖1則表示操做成功。tomcat
圖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如何獲取出來用於測試,你能夠用Chrome的Developer Tools或者Firefox的FireBug進行獲取。
http_load -p 50 -s 600 url.txt
在dosh下輸入如上所示的命令,該命令使用http_load對url.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進行分析。
(4)jvisualvm分析
圖2 CPU變化圖
由圖片能夠得出,簡單的壓力測試中CPU的最大佔有率達到19%左右,測試環境是在個人我的PC機(I5CPU)上,可見併發對CPU的壓力仍是很大的。峯值以後的曲線仍是比較平緩的,這是CPU的調度能力發揮了做用。假如是對服務器作併發測試的話,這個數據就顯得很是重要了。
圖3 佔用CPU最大的三個方法
Tomcat服務器自帶的任務調度和oracle數據庫鏈接佔據了最大的CPU,可見咱們的主要壓力都做用在了oracle和tomcat上了。
圖4 堆內存變化圖
堆內存中,最大的使用內存才達到414M左右,可見併發對內存的要求不高。曲線很是祕密的那一塊說明發生了頻繁的產生對象和垃圾回收,JVM的GC仍是很是強大的,它一直在背後默默的回收垃圾。除了峯值參考,曲線的另外一個意義在於,觀察上升和降低的幅度是否大抵一致,如若一直上漲,就有多是程序出了問題,例如某個for循環寫錯了,這個時候就會報java.lang.OutOfMemoryError: Java heap space錯誤。
圖5 持久代內存變化圖
持久代的內存徹底沒有波動,說明咱們沒有發生內存溢出(通常內存溢出都是這裏發生的)。爲何通常的內存溢出會發生在這裏?PermGen [3]意爲permanent generation,即持久代(年老代),程序頻繁的讀/寫數據庫將會對這一層形成極大壓力,溢出後會報java.lang.OutOfMemoryError: PermGen space錯誤。
圖6 佔用內存最大的三個類
這裏咱們能夠得出,字符串類型的操做以及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
下面對全部參數進行一一解釋:
另外,若是你要爲你的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/內存使用圖以下:
圖6 堆內存變化圖
圖7 CPU變化圖
CPU的變化最大不超過20%,然而調優後須要考慮到因爲程序能處理更多的併發,那麼也會拉長GC的回收時間,那你所須要注意的是就是這麼長的時間裏峯值會達到多少,應該在參數配置中予以考慮。
(7)總結
Tomcat的性能足以承受咱們平常工做的併發操做,可是須要配置調優參數以防止撐爆,而且爲了提升數據庫交互的效率咱們最好使用鏈接池技術。
[1] Java自帶的GUI性能監控工具Jconsole以及JisualVM簡介
[3] JVM調優總結(十)-調優方法
[4] JVM 幾個重要的參數 & Java HotSpot VM Options & Java 6 JVM參數選項大全(中文版)
任務介紹:
Apache Tomcat是目前較爲流行的web服務器,以其技術先進、性能穩定著稱,其次它仍是一個免費開源的項目。
Tomcat性能分析的意義在於能爲平常工做中的一些內存泄露和tomcat crash問題提供參考,本文主要經過一些工具的使用和一些參數的講解,穿插分析tomcat性能。
預研目標:
經過壓力測試以及性能檢測工具監控,分析tomcat的性能,並作相應的調優操做。
(0)假如測試的併發數過大,請預先對tomcat的maxThreads選項進行設置;
(1)部署測試對象
以供電局需求側分析項目做爲web壓力測試對象,在其web.xml中將spring security的過濾器模塊註釋掉,並將其部署上tomcat7.0。
測試是否成功去除spring security攔截,在頁面輸入http://localhost:8080/DSM/index.jsp,如圖1則表示操做成功。
圖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如何獲取出來用於測試,你能夠用Chrome的Developer Tools或者Firefox的FireBug進行獲取。
http_load -p 50 -s 600 url.txt
在dosh下輸入如上所示的命令,該命令使用http_load對url.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進行分析。
(4)jvisualvm分析
圖2 CPU變化圖
由圖片能夠得出,簡單的壓力測試中CPU的最大佔有率達到19%左右,測試環境是在個人我的PC機(I5CPU)上,可見併發對CPU的壓力仍是很大的。峯值以後的曲線仍是比較平緩的,這是CPU的調度能力發揮了做用。假如是對服務器作併發測試的話,這個數據就顯得很是重要了。
圖3 佔用CPU最大的三個方法
Tomcat服務器自帶的任務調度和oracle數據庫鏈接佔據了最大的CPU,可見咱們的主要壓力都做用在了oracle和tomcat上了。
圖4 堆內存變化圖
堆內存中,最大的使用內存才達到414M左右,可見併發對內存的要求不高。曲線很是祕密的那一塊說明發生了頻繁的產生對象和垃圾回收,JVM的GC仍是很是強大的,它一直在背後默默的回收垃圾。除了峯值參考,曲線的另外一個意義在於,觀察上升和降低的幅度是否大抵一致,如若一直上漲,就有多是程序出了問題,例如某個for循環寫錯了,這個時候就會報java.lang.OutOfMemoryError: Java heap space錯誤。
圖5 持久代內存變化圖
持久代的內存徹底沒有波動,說明咱們沒有發生內存溢出(通常內存溢出都是這裏發生的)。爲何通常的內存溢出會發生在這裏?PermGen [3]意爲permanent generation,即持久代(年老代),程序頻繁的讀/寫數據庫將會對這一層形成極大壓力,溢出後會報java.lang.OutOfMemoryError: PermGen space錯誤。
圖6 佔用內存最大的三個類
這裏咱們能夠得出,字符串類型的操做以及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
下面對全部參數進行一一解釋:
另外,若是你要爲你的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/內存使用圖以下:
圖6 堆內存變化圖
圖7 CPU變化圖
CPU的變化最大不超過20%,然而調優後須要考慮到因爲程序能處理更多的併發,那麼也會拉長GC的回收時間,那你所須要注意的是就是這麼長的時間裏峯值會達到多少,應該在參數配置中予以考慮。
(7)總結
Tomcat的性能足以承受咱們平常工做的併發操做,可是須要配置調優參數以防止撐爆,而且爲了提升數據庫交互的效率咱們最好使用鏈接池技術。
[1] Java自帶的GUI性能監控工具Jconsole以及JisualVM簡介
[3] JVM調優總結(十)-調優方法
[4] JVM 幾個重要的參數 & Java HotSpot VM Options & Java 6 JVM參數選項大全(中文版)