王 卉,趙政文,齊萬華
(西北工業(yè)大學計算機學院,西安 710068)
隨著軟件的發(fā)展和應用,用戶關注的已經(jīng)不僅僅是軟件的功能,性能也開始成為關注的焦點。因此開發(fā)人員希望通過對被測系統(tǒng)進行性能測試,定位性能瓶頸,分析引起性能問題的原因。由于軟件的性能最終要通過系統(tǒng)的整體性能表現(xiàn)出來,一般開發(fā)人員因為各種因素,并不能通過代碼來對系統(tǒng)的資源利用率和相關資源(如網(wǎng)絡、數(shù)據(jù)庫、應用服務器等)的使用和消耗數(shù)據(jù)進行性能分析和測試。Windows作為最廣泛使用的操作系統(tǒng),對其內核的運行狀態(tài)進行可視化研究很有意義。
可視化泛指利用計算機圖形學和圖像處理技術,將數(shù)據(jù)轉換成圖形或圖像在屏幕上顯示出來并進行交互處理的理論、方法和技術,這是一個展示數(shù)據(jù)并獲得對數(shù)據(jù)更深層次認識的過程?;赪indows內核運行過程的可視化系統(tǒng)通過調用ETW,并在開發(fā)程序的關鍵處插入代碼,當代碼在內核中運行時,以事件跟蹤的方式實時進行采集、解析,并通過可視化界面工具打開。由此開發(fā)人員可以通過代碼運行時系統(tǒng)的資源利用率和對相關資源(如網(wǎng)絡、數(shù)據(jù)庫、應用服務器等)的使用等進行性能分析和測試。
作為性能分析及數(shù)據(jù)采集的系統(tǒng),應遵守以下準則:
(1)真實性:采集出的數(shù)據(jù)可視化后反應的是真實的系統(tǒng)運行狀況,獲取系統(tǒng)最真實的性能表現(xiàn)。
(2)動態(tài)性:體現(xiàn)各種操作執(zhí)行的時序關系。
(3)可靠性,系統(tǒng)具有容錯能力和可連續(xù)運行的能力。
(4)可用性,系統(tǒng)開銷要小,不會嚴重降低系統(tǒng)和網(wǎng)絡性能。
(5)適應性,對系統(tǒng)來說必須是易于開發(fā)的,可添加新的功能,能隨時適應系統(tǒng)環(huán)境的改變。
Windows事件跟蹤(ETW)是操作系統(tǒng)提供的一個高速通用的跟蹤工具,能夠滿足上述需求。ETW的優(yōu)勢在于結合使用系統(tǒng)內核模式和用戶模式的組件,優(yōu)化事件日志的快速寫入,在實際操作環(huán)境中實現(xiàn)詳細跟蹤。ETW在內核中實現(xiàn)緩沖和日志記錄機制,日志記錄機制使用處理器的緩沖區(qū),當緩沖區(qū)滿或是ETW會話終止時,系統(tǒng)將提前轉儲緩沖區(qū)的內容,由異步寫線程將這些緩沖區(qū)寫入磁盤。這樣,在寫入事件時大型服務器應用程序所受的干擾可以被降至最小。從Windows Vista開始,微軟新推出了ETW統(tǒng)一事件提供程序模型和API。使用ETW提供的程序API,任何應用程序DLL或驅動程序都可以成為事件的提供程序(引發(fā)事件的組件),因此任何可被記錄的重要活動都可以成為事件。
使用系統(tǒng)附帶的控制器應用程序logman,在本地和遠程系統(tǒng)上調用 ETW,以“事件跟蹤方式(event trace)”對于指定時間段內的事件跟蹤日志進行收集。使用logman工具啟動ETW會話和事件提供程序,由提供程序引發(fā)的事件寫入ETW會話中,當會話終止時,跟蹤事件跟蹤器將日志記錄在以.etl為擴展名的二進制文件中。數(shù)據(jù)解析主要是依據(jù)事件的不同類型,不同觀察粒度對采集的二進制數(shù)據(jù)提取進程/線程號、時間戳、提供程序GUID、CPU時間、CPU ID等等,并且通過數(shù)據(jù)的分類整理,轉變?yōu)橐?guī)整的可視化工具數(shù)據(jù)。
可視化界面沿著時間軸真實的還原了代碼運行時,進程的整個運行狀態(tài),包括磁盤和CPU占用時間狀況和調度狀況、進程間的通信狀況。
可視化工具,是利用MFC編程實現(xiàn)的。把采集出的信息進行解析處理,將解析出的數(shù)據(jù)導入到可視化工具,輸出可視化界面,如圖1所示。
圖1 一個java進程的可視化實例
圖1展示一個java線程沿著時間軸的整個事務過程。圖的左側是系統(tǒng)運行時進程的列表,包括進程名和線程號。右側就是所有進程/線程在內核中運行的圖形顯示,進程/線程對CPU和磁盤的使用分開表示,進程/線程在CPU使用時,將之劃分為“可執(zhí)行狀態(tài)”、“執(zhí)行中”和“休眠狀態(tài)”三種狀態(tài),在“執(zhí)行中”狀態(tài)根據(jù)用戶模式、內核模式、缺頁異常等活動類型,根據(jù)進程/線程的狀態(tài)和活動類型的不同,以適當?shù)念伾右詤^(qū)分。當線程從休眠狀態(tài)變?yōu)榭蓤?zhí)行狀態(tài)時使用箭頭表示,以不同的顏色進行區(qū)分wakeup的原因,如網(wǎng)絡時間中斷、時間片中斷、其他進程中斷等等。時間軸顯示的是相對時間,可以通過修改設置,變?yōu)榻^對時間。
圖1中顯示ID號為17631的java線程與ID號為17657的postmaster線程之間通信的動作。圖1中ID號為17631的java線程有“202”的數(shù)字,是事件提供程序ApProbe Trace在應用程序中插入的探測點,“202”作為methodID是用戶自定義的,通過這些探測點的加入,用戶可以更好的跟蹤代碼在內核中運行的真實狀況。
圖2所示的是用戶點擊使用flash制作的網(wǎng)頁鏈接時一個事務的執(zhí)行過程,可視化界面上顯示從瀏覽器進程結束到Framework進程的執(zhí)行中出現(xiàn)了延遲,并且瀏覽器進程占用了很多資源,消耗了很多時間。這些延遲和消耗過多的資源需要具體分析其原因,也可以將運行程序在不同的配置環(huán)境中運行,得出可視化界面,分析是因為系統(tǒng)環(huán)境造成的延遲和損耗還是因為代碼等其他原因。
因此通過內核運行的可視化界面,開發(fā)人員能夠真實的了解到應用程序在各種不同操作系統(tǒng)內核中的運行狀態(tài),對比性能指標進行性能分析。
圖2 一個事務執(zhí)行過程的圖形化顯示
某一Java產(chǎn)品一到自己的框架處理處響應時間就從40毫秒增加到700毫秒。開發(fā)人員無法分析出問題原因,通過使用本系統(tǒng),使動作/性能可視化、只用了半天時間問題點就明確化,問題得到解決。
通過可視化測試結果,進行詳細分析,發(fā)現(xiàn)有兩個問題,見圖3中第一幅圖虛線框出的①和②兩個部分。
圖3 利用可視化進行性能分析的實例
問題:
①CPU等待/空閑區(qū)間過多;
②與其他Java線程之間通信頻繁。
根據(jù)問題應采取以下措施進行改善:
①CPU等待/空閑區(qū)間的原因檢討;
②減少java線程間的通信次數(shù);
③減少java線程的訪問時間。
通過以上三點對代碼進行改善,再次運行后,對比發(fā)現(xiàn):改善前需要312毫秒的處理時間,改善后只需要69毫秒(約1/5)。
注:上下兩幅圖倍率,區(qū)間相同(時間間隔200毫秒)
與 Windows Performance Monitor相比,Event Tracing for Windows旨在提供較低開銷的跟蹤。ETW通常占用不超過5%的CPU,它每秒可以記錄多達20,000條事件,啟用實時跟蹤會相當快。在性能調查過程中,通常會檢查四個因素:CPU、磁盤I/O、內存和可伸縮性。大多數(shù)調查都將從CPU開始,CPU將影響應用程序的啟動和執(zhí)行時間。在診斷較長的啟動時間時,檢查磁盤I/O是最有用的,磁盤I/O是冷啟動時間的主要因素,冷啟動時間是指內存中沒有某個應用程序時(如重啟后)啟動此應用程序所花的時間,而過多的內存消耗(或泄露)可能會導致應用程序隨時間的流逝變得更慢。
通過對Windows操作系統(tǒng)內核進行可視化,并結合一個例子展示了性能分析的應用。實例證明對內核狀態(tài)的數(shù)據(jù)采集、解析和還原對性能優(yōu)化是可用的,目前的工作已獲得階段性成果。但是利用系統(tǒng)的可視化界面進行軟件性能分析和優(yōu)化,需要有專業(yè)知識的開發(fā)人員去完成。如何更好的使用這一工具,還需要進一步的研究。
[1]Darren Mar-Elia.深入 Windows跟蹤日志[J].系統(tǒng)網(wǎng)絡,2004,1(1):50 -57.
[2]Dr.Insung Park,Alex Bendetovers.Event Tracing for Windows[EB/OL].MSDN Magazine.(2009) [2012].http://msdn.microsoft.com/zh - cn/magazine/ee 412263.aspx.
[3]Dr.Insung Park,Ricky Buch.使用 ETW 改善調試和性能優(yōu)化[EB/OL].MSDN Magazine,(2007)[2012],http://msdn.microsoft.com/zh - cn/magazine/cc 163437.aspx.
[4]RUSSINOVICH ME,SOLOMON DA.深入解析 Windows操作系統(tǒng):MicrosoftWindowsServe:2003,Windows XP and Windows2000技術內幕[M].北京:電子工業(yè)出版社,2007.
[5]Carver,R.H.,K.- C.Tai.Use of sequencing constraints for specification-based testing of concurrent programs[J].IEEE Transactions on Software Engineering,1998,24(6):471-490.
[6]Emrath,P.A.,S.Ghosh,D.A.Padua.Detecting nondeterminacy in parallel programs[J].IEEE Software,1992,9(1):69-77.
[7]劉群策.LoadRunner和軟件項目性能測試[M].北京:機械工業(yè)出版社,2007.
[8]段念.軟件性能測試過程詳解與案例剖析[M].北京:清華大學出版社,2006.