王 卉,趙政文,齊萬華
(西北工業大學計算機學院,西安 710068)
隨著軟件的發展和應用,用戶關注的已經不僅僅是軟件的功能,性能也開始成為關注的焦點。因此開發人員希望通過對被測系統進行性能測試,定位性能瓶頸,分析引起性能問題的原因。由于軟件的性能最終要通過系統的整體性能表現出來,一般開發人員因為各種因素,并不能通過代碼來對系統的資源利用率和相關資源(如網絡、數據庫、應用服務器等)的使用和消耗數據進行性能分析和測試。Windows作為最廣泛使用的操作系統,對其內核的運行狀態進行可視化研究很有意義。
可視化泛指利用計算機圖形學和圖像處理技術,將數據轉換成圖形或圖像在屏幕上顯示出來并進行交互處理的理論、方法和技術,這是一個展示數據并獲得對數據更深層次認識的過程。基于Windows內核運行過程的可視化系統通過調用ETW,并在開發程序的關鍵處插入代碼,當代碼在內核中運行時,以事件跟蹤的方式實時進行采集、解析,并通過可視化界面工具打開。由此開發人員可以通過代碼運行時系統的資源利用率和對相關資源(如網絡、數據庫、應用服務器等)的使用等進行性能分析和測試。
作為性能分析及數據采集的系統,應遵守以下準則:
(1)真實性:采集出的數據可視化后反應的是真實的系統運行狀況,獲取系統最真實的性能表現。
(2)動態性:體現各種操作執行的時序關系。
(3)可靠性,系統具有容錯能力和可連續運行的能力。
(4)可用性,系統開銷要小,不會嚴重降低系統和網絡性能。
(5)適應性,對系統來說必須是易于開發的,可添加新的功能,能隨時適應系統環境的改變。
Windows事件跟蹤(ETW)是操作系統提供的一個高速通用的跟蹤工具,能夠滿足上述需求。ETW的優勢在于結合使用系統內核模式和用戶模式的組件,優化事件日志的快速寫入,在實際操作環境中實現詳細跟蹤。ETW在內核中實現緩沖和日志記錄機制,日志記錄機制使用處理器的緩沖區,當緩沖區滿或是ETW會話終止時,系統將提前轉儲緩沖區的內容,由異步寫線程將這些緩沖區寫入磁盤。這樣,在寫入事件時大型服務器應用程序所受的干擾可以被降至最小。從Windows Vista開始,微軟新推出了ETW統一事件提供程序模型和API。使用ETW提供的程序API,任何應用程序DLL或驅動程序都可以成為事件的提供程序(引發事件的組件),因此任何可被記錄的重要活動都可以成為事件。
使用系統附帶的控制器應用程序logman,在本地和遠程系統上調用 ETW,以“事件跟蹤方式(event trace)”對于指定時間段內的事件跟蹤日志進行收集。使用logman工具啟動ETW會話和事件提供程序,由提供程序引發的事件寫入ETW會話中,當會話終止時,跟蹤事件跟蹤器將日志記錄在以.etl為擴展名的二進制文件中。數據解析主要是依據事件的不同類型,不同觀察粒度對采集的二進制數據提取進程/線程號、時間戳、提供程序GUID、CPU時間、CPU ID等等,并且通過數據的分類整理,轉變為規整的可視化工具數據。
可視化界面沿著時間軸真實的還原了代碼運行時,進程的整個運行狀態,包括磁盤和CPU占用時間狀況和調度狀況、進程間的通信狀況。
可視化工具,是利用MFC編程實現的。把采集出的信息進行解析處理,將解析出的數據導入到可視化工具,輸出可視化界面,如圖1所示。

圖1 一個java進程的可視化實例
圖1展示一個java線程沿著時間軸的整個事務過程。圖的左側是系統運行時進程的列表,包括進程名和線程號。右側就是所有進程/線程在內核中運行的圖形顯示,進程/線程對CPU和磁盤的使用分開表示,進程/線程在CPU使用時,將之劃分為“可執行狀態”、“執行中”和“休眠狀態”三種狀態,在“執行中”狀態根據用戶模式、內核模式、缺頁異常等活動類型,根據進程/線程的狀態和活動類型的不同,以適當的顏色加以區分。當線程從休眠狀態變為可執行狀態時使用箭頭表示,以不同的顏色進行區分wakeup的原因,如網絡時間中斷、時間片中斷、其他進程中斷等等。時間軸顯示的是相對時間,可以通過修改設置,變為絕對時間。
圖1中顯示ID號為17631的java線程與ID號為17657的postmaster線程之間通信的動作。圖1中ID號為17631的java線程有“202”的數字,是事件提供程序ApProbe Trace在應用程序中插入的探測點,“202”作為methodID是用戶自定義的,通過這些探測點的加入,用戶可以更好的跟蹤代碼在內核中運行的真實狀況。
圖2所示的是用戶點擊使用flash制作的網頁鏈接時一個事務的執行過程,可視化界面上顯示從瀏覽器進程結束到Framework進程的執行中出現了延遲,并且瀏覽器進程占用了很多資源,消耗了很多時間。這些延遲和消耗過多的資源需要具體分析其原因,也可以將運行程序在不同的配置環境中運行,得出可視化界面,分析是因為系統環境造成的延遲和損耗還是因為代碼等其他原因。
因此通過內核運行的可視化界面,開發人員能夠真實的了解到應用程序在各種不同操作系統內核中的運行狀態,對比性能指標進行性能分析。

圖2 一個事務執行過程的圖形化顯示
某一Java產品一到自己的框架處理處響應時間就從40毫秒增加到700毫秒。開發人員無法分析出問題原因,通過使用本系統,使動作/性能可視化、只用了半天時間問題點就明確化,問題得到解決。
通過可視化測試結果,進行詳細分析,發現有兩個問題,見圖3中第一幅圖虛線框出的①和②兩個部分。

圖3 利用可視化進行性能分析的實例
問題:
①CPU等待/空閑區間過多;
②與其他Java線程之間通信頻繁。
根據問題應采取以下措施進行改善:
①CPU等待/空閑區間的原因檢討;
②減少java線程間的通信次數;
③減少java線程的訪問時間。
通過以上三點對代碼進行改善,再次運行后,對比發現:改善前需要312毫秒的處理時間,改善后只需要69毫秒(約1/5)。
注:上下兩幅圖倍率,區間相同(時間間隔200毫秒)
與 Windows Performance Monitor相比,Event Tracing for Windows旨在提供較低開銷的跟蹤。ETW通常占用不超過5%的CPU,它每秒可以記錄多達20,000條事件,啟用實時跟蹤會相當快。在性能調查過程中,通常會檢查四個因素:CPU、磁盤I/O、內存和可伸縮性。大多數調查都將從CPU開始,CPU將影響應用程序的啟動和執行時間。在診斷較長的啟動時間時,檢查磁盤I/O是最有用的,磁盤I/O是冷啟動時間的主要因素,冷啟動時間是指內存中沒有某個應用程序時(如重啟后)啟動此應用程序所花的時間,而過多的內存消耗(或泄露)可能會導致應用程序隨時間的流逝變得更慢。
通過對Windows操作系統內核進行可視化,并結合一個例子展示了性能分析的應用。實例證明對內核狀態的數據采集、解析和還原對性能優化是可用的,目前的工作已獲得階段性成果。但是利用系統的可視化界面進行軟件性能分析和優化,需要有專業知識的開發人員去完成。如何更好的使用這一工具,還需要進一步的研究。
[1]Darren Mar-Elia.深入 Windows跟蹤日志[J].系統網絡,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 改善調試和性能優化[EB/OL].MSDN Magazine,(2007)[2012],http://msdn.microsoft.com/zh - cn/magazine/cc 163437.aspx.
[4]RUSSINOVICH ME,SOLOMON DA.深入解析 Windows操作系統:MicrosoftWindowsServe:2003,Windows XP and Windows2000技術內幕[M].北京:電子工業出版社,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].北京:機械工業出版社,2007.
[8]段念.軟件性能測試過程詳解與案例剖析[M].北京:清華大學出版社,2006.