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