上期我們講到LoaRunner性能測試Tomcat結(jié)果體系堰怨,這期我們講LoaRunner性能測試Tomcat監(jiān)控。
Tomcat監(jiān)控
omcat服務(wù)器是一個免費的開放源代碼的Web應(yīng)用服務(wù)器发绢,Tomcat是Apache軟件基金會
(Apache Software Foundation)Jakarta
項目中的一個核心項目,由Apache男韧、Sun和其他一些公司及個人共同開發(fā)而成朴摊。
Tomcat是一個輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶的場合下被普遍使用此虑,是開發(fā)和調(diào)試JSP程序的首選甚纲。所以在性能測試過程需要經(jīng)常監(jiān)控Tomcat服務(wù)器。
通常監(jiān)控Tomcat服務(wù)器的方法有以下三種:
第一:使用Tomcat自帶的status頁進行監(jiān)控朦前。
第二:使用Java管理擴展監(jiān)測工具Jconsole進行監(jiān)控介杆。
第三:使用Probe進行監(jiān)控。
將對這三種監(jiān)控方法進行詳細的介紹韭寸。
status頁監(jiān)控
Status頁對Tomcat監(jiān)控的步驟如下:
步驟1:修改配置文件tomcat-users(該文件在Tomcat安裝程序根目錄中的conf文件夾中)春哨,添加一個admin設(shè)置權(quán)限,在中添加的內(nèi)容如下:
<role rolename="admin-gui"/>
<user username="admin" password="1234"?
roles="manager-gui"/>
步驟2:修改完成后恩伺,重啟Tomcat服務(wù)器赴背,在瀏覽器中輸入
URL(http://localhost:8080/)
如果是遠程訪問,訪問的URL為
http://IP:8080
如圖所示晶渠。
在Status Management頁面凰荚,提供幾種監(jiān)控Tomcat的內(nèi)容,主要包括
Server status和Host Manager兩個方面的內(nèi)容褒脯。
Server status主要是顯示服務(wù)器相關(guān)的信息便瑟,主要包括:
Server Information、JVM和接連器相關(guān)的內(nèi)容番川。
Server Information主要是顯示了服務(wù)器配置的相關(guān)信息到涂,如圖所示。
JVM部分主要顯示了JVM的詳細信息颁督,包括JVM總的大小践啄、剩余大小等相關(guān)信息,并統(tǒng)計了每個代所消耗內(nèi)存的情況沉御,當然如果需要看懂這些值往核,就必須和JVM設(shè)置相關(guān)的參數(shù)對照的來看,這樣才可以更好的理解嚷节,當然如果要看詳細的每個時間這個值的變化情況聂儒,這里是無法給到的。
Free memory: 30.38 MB Total memory: 65.60 MB Max memory: 506.31 MB
Free memory:空閑內(nèi)存大辛蛱怠衩婚;
Total memory:總內(nèi)存大小效斑;
Max mermory:最大內(nèi)存大蟹谴骸;
接連器在這里其實有兩種:ajp和http兩種連接器缓屠,我們一般看到多的是http的連接器奇昙,因為一般來說都是通過HTTP來發(fā)送請求的。HTTP連接器的內(nèi)容如圖所示敌完。
Max threads: 300 Current thread count: 10 Current thread busy: 1 Keep alive sockets count: 1
Max processing time: 2357 ms Processing time: 8.778 s Request count: 155 Error count: 2 Bytes received: 0.00 MB Bytes sent: 2.03 MB
Max threads:最大線程數(shù)储耐;
Min spare threads:最小空閑線程數(shù);
Max spare threads:最大空閑線程數(shù)滨溉;
Current thread count:最近運行的線程數(shù)什湘;
thread busy:正在運行的線程數(shù);
Max processing time:最大CPU時間晦攒;
Processing time:CPU消耗總時間闽撤;
Request count:請求總數(shù);
Error count:錯誤的請求數(shù)脯颜;
Bytes received:接收字節(jié)數(shù)哟旗;
Bytes sent:發(fā)送字節(jié)數(shù);
關(guān)于請求階段的有以下幾種情況:
P:表示正準備發(fā)送的請求栋操;
S:表示請求正在服務(wù)器端處理闸餐;
F:表示已經(jīng)完成的請求;
R:表示即將發(fā)送的請求讼庇;
K:表示當前活動的請求绎巨;
Jconsole監(jiān)控
JConsole的圖形用戶界面是一個符合Java管理擴展(JMX)規(guī)范的監(jiān)測工具,JConsole使用Java虛擬機(Java VM)蠕啄,提供在Java平臺上運行的應(yīng)用程序的性能和資源消耗的信息场勤。
在Java平臺,標準版(Java SE平臺)6
JConsole的已經(jīng)更新到目前的外觀歼跟,類似于Windows和GNOME桌面(其他平臺和媳,將目前標準的Java圖形的外觀和感覺),在這個文件中提出的屏幕截圖是從Windows XP上運行的接口的一個實例哈街。
Jconsole是一個可執(zhí)行文件留瞳,在Java根目錄下有一個bin文件,該文件下可以找到j(luò)console文件
單擊可直接運行該程序骚秦,如果將該jconsole的路徑設(shè)置為環(huán)境變量她倘,那么可以直接在開始菜單運行命令中直接鍵jconsole命令璧微,來運行jconsole程序,如果未設(shè)置為環(huán)境變量硬梁,那么則需要寫全路徑前硫。
啟動JConsole程序的方式有兩種:一種是帶參數(shù)的啟動;另外一種是不帶參數(shù)啟動荧止。
帶參數(shù)啟動JConsole啟動時屹电,又分有兩種情況:一種是監(jiān)控本地進程;另一種是遠程監(jiān)控跃巡;
本地監(jiān)控的命令格式如下:
JConsole processID
processID是指應(yīng)用程序的進程ID(PID)危号,可以使用以下方式確定一個應(yīng)用程序的PID:
在UNIX或Linux系統(tǒng),可以使用ps命令找到正在運行的Java實例的PID素邪;
在Windows系統(tǒng)上外莲,可以使用任務(wù)管理器,找到j(luò)ava或者javaw進程的PID娘香;
例如:如果監(jiān)控JConsole程序苍狰,JConsole的進程號為5604,那么可以用下面的命令啟動JConsole:
?JConsole 5604
遠程監(jiān)控的命令格式如下:
JConsole主機名:portNum
主機名是需要監(jiān)聽的主機烘绽,portNum是啟動Java虛擬機時指定的JMX代理的端口號淋昭。
注意:使用JConsole監(jiān)視本地應(yīng)用程序在開發(fā)和創(chuàng)建原型是非常有用的,但不推薦用于生產(chǎn)環(huán)境安接,因為Jconsole本身也消耗大量的系統(tǒng)資源翔忽。
執(zhí)行Jconsole程序時,不帶任何參數(shù)命令盏檐,會彈出Jconsole新建鏈接對話框歇式,如圖所示。
Jconsole有兩種監(jiān)控方式:
本地進程監(jiān)控和遠程監(jiān)控胡野。
選擇本地進程監(jiān)控材失,在下面的列表框中會列出與JConsole程序相同用戶的進程,選擇其中一個進程硫豆,單擊連接按鈕龙巨,即可以進行監(jiān)控的主界面。
選擇遠程監(jiān)控熊响,需要的內(nèi)容包括旨别。主機名和JMX代理的端口號,以及訪問服務(wù)器的用戶名和密碼汗茄。
當連接成功后秸弛,會彈出監(jiān)控界面,如圖所示。
監(jiān)控的內(nèi)容主要包括六個方面的內(nèi)容:
概述递览、內(nèi)存叼屠、線程、類非迹、VM摘要和MBean环鲤。
概要信息
概要信息監(jiān)控界面主要包括堆內(nèi)存使用情況、線程數(shù)憎兽、Java VM中加載類和CPU使用情況。選中各視圖可以切換監(jiān)控的時間片段吵冒,同時也可以將視圖中的數(shù)據(jù)保存在一個逗號分隔(CSV)文件中纯命。
內(nèi)存信息
內(nèi)存監(jiān)控信息主要提供了內(nèi)存消耗和內(nèi)存池的信息,如圖所示痹栖。
內(nèi)存監(jiān)控信息主要監(jiān)控了兩類內(nèi)存消耗的信息:堆和非堆內(nèi)存亿汞,這兩種內(nèi)存也是Java虛擬機管理的兩種內(nèi)存,這兩者都是Java虛擬機啟動時創(chuàng)建的揪阿。??
堆內(nèi)存是運行時數(shù)據(jù)區(qū)域疗我,JavaVM的所有類實例和數(shù)組分配內(nèi)存,可能是固定或可變大小的堆南捂。??
非堆內(nèi)存包括在所有線程和Java虛擬機內(nèi)部處理或優(yōu)化所需的共享的方法吴裤。它存儲了類的結(jié)構(gòu)、運行常量池溺健、字段和方法數(shù)據(jù)麦牺,以及方法和構(gòu)造函數(shù)的代碼,方法區(qū)在邏輯上是堆的一部分总寻,看具體實現(xiàn)的方式烤惊。根據(jù)實現(xiàn)方式的不同茎匠,Java虛擬機可能不進行垃圾收集或壓縮。與堆內(nèi)存一樣吱晒,方法區(qū)域可能是一個固定或可變大小,方法區(qū)的內(nèi)存不需要是連續(xù)的沦童。??
除了方法區(qū)仑濒,Java虛擬機可能需要進行內(nèi)部處理或優(yōu)化,這也屬于非堆內(nèi)存的內(nèi)存搞动。例如躏精,實時(JIT)編譯器需要內(nèi)存用于存儲從Java虛擬機的高性能的代碼翻譯的機器碼。??
Jconsole提供的監(jiān)控的堆和非堆的內(nèi)存主要包括以下幾類:??
EdenSpace內(nèi)存池:大多數(shù)對象初始化時分配的內(nèi)存池鹦肿;??
SurvivorSpace內(nèi)存池:這個內(nèi)存池包含的對象是回收EdenSpace內(nèi)存池后所幸存的對象矗烛;??
TenuredGen內(nèi)存池:這個內(nèi)存池包含的對象是在SurvivorSpace內(nèi)存池中已經(jīng)存在一段時間的對象;??
CodeCache內(nèi)存池:包括HotSpotJavaVM的代碼緩存和編譯、存儲代碼所消耗的內(nèi)存瞭吃;??
PermGen[shared-rw]內(nèi)存池:PermGen內(nèi)存池中讀寫的區(qū)域碌嘀;??
PermGen[shared-ro]內(nèi)存池:PermGen內(nèi)存池中只讀的區(qū)域;??
PermGen內(nèi)存池:該內(nèi)存池包括虛擬機本身反射的數(shù)據(jù)歪架,如類和方法股冗,Java虛擬機在運行時會共享這些類數(shù)據(jù)區(qū)域,共享的區(qū)域有只讀和讀寫兩種方式和蚪。?
在圖表下拉列表框中可以選擇不同內(nèi)存池進行監(jiān)控止状,并獲得當前內(nèi)存池所消耗的內(nèi)存信息,此外右下角顯示了堆和非堆的圖標攒霹,切換顯示的圖表怯疤,內(nèi)存池圖表顯示的內(nèi)容也隨著切換,如果顯示為紅色催束,那說明使用的內(nèi)存超過內(nèi)存的閥值集峦。
內(nèi)存池和內(nèi)存管理器是Java虛擬機的內(nèi)存系統(tǒng)的關(guān)鍵環(huán)節(jié)。??
一個內(nèi)存池表示Java虛擬機管理的內(nèi)存區(qū)域抠刺。Java虛擬機至少有一個內(nèi)存池塔淤,它可能在執(zhí)行過程中創(chuàng)建或刪除內(nèi)存池,一個內(nèi)存池可以屬于堆或非堆內(nèi)存速妖。??
一個內(nèi)存管理器管理一個或多個內(nèi)存池高蜂,垃圾收集器是一個負責回收不可達的對象使用內(nèi)存的內(nèi)存管理器,Java虛擬機可能有一個或更多的內(nèi)存管理器买优,在執(zhí)行過程中妨马,它可以添加或刪除內(nèi)存管理器,一個內(nèi)存池可以由一個以上的內(nèi)存管理器進行管理杀赢。??
“詳細信息”框中顯示了內(nèi)存使用的詳細信息烘跺,主要包括以下信息:??
已使用:當前使用的內(nèi)存數(shù),包括已經(jīng)使用的脂崔、可獲得或未獲得的內(nèi)存滤淳;??
分配:分配的內(nèi)存必須保證Java虛擬機所需要的使用量,提交的內(nèi)存可能會隨時間的改變而改變砌左,Java虛擬機可能會釋放系統(tǒng)內(nèi)存脖咐,分配的內(nèi)存可能會少于最初啟動時分配的內(nèi)存量,分配的內(nèi)存大于或等于需要使用的內(nèi)存量汇歹。??
最大值:內(nèi)存管理中可用的最大內(nèi)存屁擅,該值是變化的或不確定的,如果Java虛擬機使用的內(nèi)存在不斷的增長并且大于所分配的內(nèi)存量产弹,那么分配內(nèi)存將失敗派歌。??
GC時間:累積垃圾收集的時間和總調(diào)用的時間,它可能包含多行,其中每行代表一個垃圾收集器算法在Java虛擬機中所消耗的時間胶果。??
垃圾收集(GCGarbageCollect)是Java虛擬機如何釋放不再被引用的對象所占用的內(nèi)存的機制匾嘱,它通常認為的對象,有當前活動的“活著”的對象和無法引用或不獲得“死”對象早抠,垃圾收集是由釋放“死”對象所占用內(nèi)存的過程霎烙,垃圾收集的算法和參數(shù)對性能有很大的影響。??
JavaHotSpot虛擬機的垃圾收集器使用代GC蕊连,代GC的優(yōu)勢大多數(shù)都符合以下的概括:??
它們創(chuàng)建一些短暫一生的對象悬垃,如迭代和局部變量;??
它們創(chuàng)建一些長生命的對象甘苍,如高層次的持久對象盗忱;??
代GC分為幾代,并給每個指定一個或多個內(nèi)存池羊赵,當一代使用了分配的內(nèi)存,虛擬機上執(zhí)行一個局部的GC(也叫minorcollection)扇谣,內(nèi)存池回收死對象使用的內(nèi)存昧捷,這部分的GC速度通常遠遠優(yōu)于一個完整的GC。?
JavaHotSpot虛擬機定義了兩代:年輕代(有時也被稱為“托兒所”)和年老代罐寨,年輕代包括一個
“Edenspace”
“survivorspaces”
最初靡挥,VM將所有的對象在“Edenspace”內(nèi)存池中,并且大多數(shù)對象“死”在那里鸯绿,當它執(zhí)行了一次局部GC(minorGC)
VM將剩余的對象從“Edenspace”轉(zhuǎn)移到“survivorspaces”跋破,虛擬長生存時間的對象移動到年老代的“tenured”空間,當年老代填滿了瓶蝴,將是一個完整的GC毒返,一個完整的GC往往會很慢,因為它涉及到所有存活的對象舷手,永久代包含虛擬機所有本身數(shù)據(jù)的反射拧簸,如類和方法。??
如果垃圾收集器出現(xiàn)瓶頸男窟,那么可以通過自定義代大小來提高性能盆赤。??
線程信息??
線程的監(jiān)控信息如圖所示。
在左下角“線程”列表中顯示了所有活動的線程歉眷,如果需要查找指定的線程牺六,可以在“過濾器”字段中輸入待查找的線程,選中某個線程汗捡,右邊文本框即會顯示出當前線程的名稱淑际、狀態(tài)和堆棧跟蹤信息。
上面的線程數(shù)目視圖中動態(tài)的顯示當前活動線程數(shù),主要包括兩部分內(nèi)容:當前活動線程數(shù)和峰值線程數(shù)庸追。
線程監(jiān)控視圖中還提供了一個檢測死鎖線程的功能霍骄,單擊【檢測到死鎖】按鈕,如果存在任何線程對象監(jiān)視器出現(xiàn)死鎖情況淡溯,則會顯示出該死鎖線程的ID號读整,并且會顯示出當前線程的相關(guān)信息。
在MBean選項卡中可以監(jiān)視Java虛擬機線程信息的所有屬性和操作咱娶。
類信息
類的監(jiān)控信息如圖所示米间。
已裝入類的數(shù)目視圖中顯示了已裝入類的總數(shù)和當前加載的類,其實紅色表示已裝入類的總數(shù)膘侮,藍線當前加載的類屈糊。詳細信息中顯示了當前已裝入的類、已裝入類的總數(shù)和已卸載類的總數(shù)琼了。
VM摘要信息
VM摘要的監(jiān)控信息如圖所示逻锐。
在VM摘要信息中主要包括五方面的信息:摘要信息、線程和類信息雕薪、內(nèi)存信息昧诱、操作系統(tǒng)信息和其它信息。??
摘要部分的信息主要包括以下信息:??
連接名稱:連接監(jiān)控時的進程PID信息所袁;??
運行時間:開始以來Java虛擬機運行的時間總額盏档;??
處理CPU時間:JavaVM的開始,消耗的CPU時間總量燥爷;??
編譯總時間:累計時間花費在JIT編譯所花費的時間蜈亩;??
線程和類信息主要包括以下信息:??
活動線程:當前活動的線程;??
峰值:最大線程數(shù)前翎;??
守護線程:即運行在后臺的線程稚配;??
已啟動的線程總數(shù):運行到目前為止共啟動的線程數(shù);??
當前類已裝入:當前正在運行過程中已裝載類的總數(shù)鱼填;??
已裝入類的總數(shù):運行到目前為止所裝載類的總數(shù)药有;??
已卸載類的總數(shù):運行到目前為止已卸載類的總數(shù);??
內(nèi)存信息主要包括以下信息:??
當前堆大衅煌琛:當前堆分配的內(nèi)存空間愤惰;??
分配的內(nèi)存:當前已分配的內(nèi)存大小赘理;??
堆大小的最大值:對分配內(nèi)存的最大值宦言;??
暫掛結(jié)束操作:當前暫時掛起結(jié)束的對象;??
垃圾收集器:垃圾收集器描述了收集器的名稱商模、收集器收集的內(nèi)存數(shù)量和收集這些內(nèi)存所消費的時間奠旺;
操作系統(tǒng)信息主要包括操作系統(tǒng)名蜘澜、體系結(jié)構(gòu)、分配的虛擬內(nèi)存响疚、物理內(nèi)存總量鄙信、可用物理內(nèi)存、交換空間總量和可用交換空間忿晕。
其它信息主要包括以下信息:??
VM參數(shù):顯示通過應(yīng)用程序傳送給Java虛擬機的參數(shù)装诡,這些參數(shù)不包括的主要方法的參數(shù);??
類路徑:由系統(tǒng)類加載器用于搜索類文件的類路徑践盼;??
庫路徑:加載庫時要搜索的路徑列表鸦采;??
引導類路徑:引導類加載器搜索類文件的路徑列表;??
MBean信息??
MBeans選項卡顯示MBean服務(wù)器所注冊的MBeans的類咕幻,MBeans選項卡允許訪問平臺MXBean服務(wù)器渔伯,此外,還可以監(jiān)控和管理應(yīng)用程序的MBean肄程,MBean信息如圖所示锣吼。
左側(cè)顯示了當前所以運行的MBean,當選中MBean樹中某個MBean時蓝厌,右側(cè)會顯示當前被選中MBean的MBeanInfo和描述符信息吐限,在下面會顯示當前MBean的相關(guān)屬性、操作和通知信息褂始。
MBean屬性
在MBean樹中選擇一個MBean,單擊“屬性”節(jié)點描函,將顯示MBean的所有屬性崎苗,以Memory為例,如圖所示舀寓。
選中屬性下面的單個屬性胆数,在右側(cè)會顯示出當前屬性的詳細信息,如圖所示互墓。
單擊屬性值(即右側(cè)黑體字)必尼,可以展開詳細的屬性值信息,?HeapMemoryUsage屬性展開后的值篡撵,如圖所示判莉。
雙擊屬性值,可以對這些顯示的值進行修改育谬,有的屬性是以圖表的方式顯示券盅,如圖顯示的是Threading中的CurrentThreadUserTime屬性值。
Mbean操作
在MBean樹中選擇一個MBean膛檀,單擊“操作”節(jié)點锰镀,將顯示MBean的所有相關(guān)操作娘侍,以Threading為例,如圖所示泳炉。
單擊操作調(diào)用中的按鈕憾筏,可以調(diào)用這些方法,單擊某種方法可以顯示當前方法的詳細信息花鹅,如所示氧腰。
Mbean通知
在MBean樹中選擇一個MBean,單擊“通知”節(jié)點翠胰,選擇某個通知容贝,右側(cè)將顯示該通知的詳細信息,以Memory為例之景,如圖所示斤富。