QQ浏览器性能提升之路-windows性能分析工具篇
作者:jackxpzhao
如果你要在Windows上面做性能相關(guān)的工作,那WPT一定是個(gè)必備的神器。WPT的全名是Windows Performance Toolkit,是Windows下用來(lái)進(jìn)行性能分析的一套工具,它的功能非常強(qiáng)大,你可以使用它來(lái)監(jiān)控CPU,內(nèi)存,磁盤(pán)和網(wǎng)絡(luò)等等的活動(dòng),從而來(lái)確定當(dāng)前系統(tǒng)的性能瓶頸。
WPT由兩個(gè)獨(dú)立的工具組成: Windows Performance Recorder (WPR) and Windows Performance Analyzer (WPA)。顧名思義,WPR記錄Windows ETW產(chǎn)生的性能數(shù)據(jù)從而生成ETL文件,WPA則負(fù)責(zé)分析ETL文件。
安裝和說(shuō)明
你可以通過(guò)下載安裝Windows ADK得到 Windows 性能工具包 (WPT) 。https://www.microsoft.com/zh-CN/download/details.aspx?id=39982
安裝后幾個(gè)比較重要的文件,默認(rèn)路徑在:C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit
wpa.exe — 解析ETL文件,并圖形化、表格化展示。
wpaexporter.exe — 導(dǎo)出ETL文件的解析結(jié)果成文本格式。
wpr.exe — 記錄ETW產(chǎn)生的數(shù)據(jù),命令行模式。
WPRUI.exe — 記錄ETW產(chǎn)生的數(shù)據(jù),圖形化界面,更友好。
xperf.exe — 早期版本W(wǎng)PT的核心組件Xperf,所以現(xiàn)在也習(xí)慣將WPT稱為XPerf。Xperf的功能類(lèi)似于現(xiàn)在的wpr+wpaexporter,可以記錄ETW產(chǎn)生的數(shù)據(jù),也可以導(dǎo)出結(jié)果到文本。
xperfview — 早期版本W(wǎng)PT中的分析工具,功能和現(xiàn)在的wpa一樣,WPT從版本8以后已經(jīng)沒(méi)有這個(gè)exe了。在WinXP上只能使用舊版的Xperf,而且建議用對(duì)應(yīng)的xperfview打開(kāi)分析。
工作原理
和其他的性能分析工具不同,WPT是由Windows本身的事件機(jī)制來(lái)提供支持的——Event Tracing for Windows (ETW)。
ETW是從Windows 2000開(kāi)始就引入的一種高速的事件記錄機(jī)制,自那時(shí)以后,各種Windows操作系統(tǒng)核心和服務(wù)組件都通過(guò)ETW記錄其活動(dòng),它現(xiàn)在是Windows平臺(tái)上的關(guān)鍵系統(tǒng)儀表技術(shù)之一。在Windows 7中,ETW得到了進(jìn)一步的增強(qiáng)。 正是基于ETW的優(yōu)秀性能和強(qiáng)大功能,越來(lái)越多的第三方應(yīng)用程序開(kāi)始放棄自己的日志系統(tǒng),逐漸開(kāi)始使用ETW來(lái)追蹤和記錄其狀態(tài)和活動(dòng),從而進(jìn)行性能調(diào)優(yōu)或是進(jìn)行應(yīng)用程序的日常維護(hù)。
下圖來(lái)自MSDN,ETW的主要基本架構(gòu)分成4個(gè)部分:Provider,Controller,Consumer和Session。
Provider:所謂的Provider,就是事件的提供者,它可以是系統(tǒng)組件,驅(qū)動(dòng)程序或者是我們開(kāi)發(fā)的應(yīng)用程序, 我們?cè)谧詈蟮挠涗浳募锌吹降氖录褪莵?lái)自于他們。首先,它需要向系統(tǒng)進(jìn)行注冊(cè)一個(gè)Event Trace,然后當(dāng)這個(gè)Provider被Controller啟動(dòng)(Enable)后,它就可以開(kāi)始向相應(yīng)的Event Trace Session發(fā)送事件了。
Controller:Controller就是一個(gè)控制器。它的主要任務(wù)有兩個(gè):一是Event Trace Session的控制管理。它利用StartTracefunction在內(nèi)存中創(chuàng)建一個(gè)Event Trace session,這樣Provider就知道該往哪里發(fā)生事件。而Controller也會(huì)負(fù)責(zé)將Session里記錄的事件送到Consumer。Controller的第二個(gè)任務(wù)就是對(duì)Provider進(jìn)行管理,啟動(dòng)或是停止Provider。
Consumer:Consumer實(shí)時(shí)地從Event Trace Session或者是日志文件中訂閱事件。
Session:它存在于內(nèi)核中,用于表示一個(gè)ETW事件記錄會(huì)話。系統(tǒng)中可以存在多個(gè)Session,每個(gè)Session都可以接收來(lái)自于多個(gè)Provider的事件,最后我們可以將多個(gè)Session中的事件寫(xiě)入一個(gè)日志文件中,這個(gè)日志文件就叫做Trace。
通過(guò)ETW,我們可以將系統(tǒng)所有關(guān)鍵的地方都加入事件,記錄其行為和堆棧,比如CPU執(zhí)行,線程切換和讀寫(xiě)磁盤(pán),這樣我們就可以利用這些信息來(lái)進(jìn)行分析了。
更多的工作原理大家可以自行參考官方介紹。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363668(v=vs.85).aspx
如何開(kāi)始
說(shuō)這么多,究竟如何才能定位性能問(wèn)題呢?
把大象放進(jìn)冰箱需要三步:第一步,把冰箱門(mén)打開(kāi);第二步,把大象放進(jìn)去;第三步把冰箱門(mén)帶上。我們只需要兩步:
1) 生成ETL文件
先啟動(dòng)Xperf,這里只列了幾個(gè)常用的參數(shù)
xperf -start SessionName -on Flags|Groups -f filename -maxfile Size -filemode Mode -stackwalk flags|@file
-start [SessionName]:需要啟動(dòng)的Session Name,只記錄kernel logging的話Name可以為空。
-on Flags|Groups:指定需要開(kāi)啟的provider flags or groups,通過(guò)加號(hào)(+)分隔。
-f filename:指定寫(xiě)入的文件名字,Kernel trace默認(rèn)是Kernel.etl, user trace默認(rèn)是User.etl。
-maxfile Size:限定日志文件的大小,單位MB。
-filemode Mode:指定文件寫(xiě)入模式,默認(rèn)是”Sequential”,還有”Circular”, “Append”, “NewFile”。
-stackwalk flags|@file:開(kāi)啟call stack的記錄。
然后停止Xperf并生成ETL文件。
xperf -stop -stop Usersesssion -d filename
第一個(gè)stop停止kernel logging的記錄,第二個(gè)stop停止名為Usersesssion的session,如果沒(méi)有user session直接xperf -stop -d filename即可。
2) 分析ETL文件
使用wpa打開(kāi)ETL文件,或者通過(guò)Xperf、wpaexporter導(dǎo)成文本格式分析。
踩過(guò)的坑
Xperf的啟動(dòng)、配置、解析有很多參數(shù),不是很容易上手,這里說(shuō)下幾個(gè)踩過(guò)的坑。
1) 版本問(wèn)題:目前Xperf能下載到的版本有4.8 / 6.3 / 10.0,這幾個(gè)版本的兼容性并不是很好,生成ETL文件后,一定注意要用同版本的Xperf、WPA或是XperfView去分析,用不同版本的話會(huì)有一些奇怪的問(wèn)題,例如打開(kāi)報(bào)錯(cuò)、看不到關(guān)鍵數(shù)據(jù)、閃退等等。
2) 如果你正在使用Process Monitor或Process Explorer,需要先關(guān)閉它們?cè)賳?dòng)Xperf,否則會(huì)報(bào)錯(cuò),因?yàn)檫@兩個(gè)工具也會(huì)通過(guò)ETW收集信息。
3) Win XP只支持老版本的WPT,也就是用WPT版本6(XPerf Version 4.8)捕獲Trace。
4) Xperf的啟動(dòng)參數(shù)很多,開(kāi)的越多帶來(lái)的額外系統(tǒng)開(kāi)銷(xiāo)也會(huì)越多,ETL文件也會(huì)越大。所以一定要按需配置,有針對(duì)性的開(kāi)啟需要的providers。
- 5) 雖然我習(xí)慣了Xperf,但還是推薦大家優(yōu)先嘗試新版本里面的WPRUI,在易用性方面已經(jīng)改善了很多。關(guān)于各個(gè)Scenario的含義,可以參考微軟的官方文檔。(當(dāng)然他們寫(xiě)的很簡(jiǎn)略……)
https://msdn.microsoft.com/zh-CN/library/windows/hardware/dn927307.aspx
- 6) 針對(duì)Xperf配置麻煩的問(wèn)題我也封裝了一個(gè)腳本,啟動(dòng)參數(shù)包含一些經(jīng)常用到的providers,循環(huán)文件寫(xiě)入模式,支持Win7 / Win10 / XP。碰到可以復(fù)現(xiàn)的性能問(wèn)題時(shí),雙擊對(duì)應(yīng)的bat腳本即可。也推薦同學(xué)們嘗試,可以在附件里面下載。
- 7) 如果開(kāi)啟調(diào)用堆棧(call stacks)記錄功能,得先有對(duì)應(yīng)的providers flag,然后通過(guò)-stackwalk開(kāi)啟堆棧調(diào)用記錄。下面這個(gè)例子記錄sampling profiler call stacks。
xperf -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile
在64位的Windows開(kāi)啟stackwalk的功能需要設(shè)置注冊(cè)表DisablePagingExecutive。
REG ADD “HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management” -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f
設(shè)置完成后需要重啟操作系統(tǒng)才能記錄調(diào)用堆棧。
高CPU占用實(shí)戰(zhàn)
持續(xù)的高CPU占用是很常見(jiàn)的性能問(wèn)題,為了方便重現(xiàn),我們先借助小工具CPUSTRES.EXE模擬High CPU usage。軟件打開(kāi)后active所有的thread,并設(shè)置下activity為Max即可。
通過(guò)Process Explorer可以看到系統(tǒng)的CPU占用已經(jīng)達(dá)到50%左右,大部分都是CPUSTRES造成的。
1. 生成ETL文件
現(xiàn)在我們先通過(guò)上文中提到的腳本捕獲一個(gè)有效的ETL文件。
雙擊“Win7_開(kāi)始監(jiān)控.bat”,出現(xiàn)提示字樣開(kāi)始等待,因?yàn)檫@是CPU持續(xù)占用問(wèn)題,特征很明顯,等待幾秒鐘后Xperf就應(yīng)該收集到了足夠多的信息。
在命令行窗口回車(chē),腳本會(huì)自動(dòng)生成ETL文件并壓縮。
如果你想手動(dòng)啟停Xperf的話,可以在命令行輸入:
xperf.exe -start -on Base -stackwalk Profile
已知是CPU占用問(wèn)題,不要開(kāi)啟其他providers,其中Base provider本身是一個(gè)kernel group,包含:PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO+MEMINFO_WS
片刻后命令行停止即可:
xperf -stop –d test.etl
你也可以通過(guò)WPR或是WPRUI來(lái)捕獲這個(gè)ETL文件。(自己動(dòng)手試試吧……)
2. 分析這個(gè)ETL文件
打開(kāi)之后我們會(huì)發(fā)現(xiàn)WPA的左側(cè)有很多的圖,并且他們被分為幾類(lèi):
System Activity:系統(tǒng)活動(dòng),里面主要是進(jìn)程線程的生命周期,原始事件等等內(nèi)容。
Computation:記錄了CPU的各項(xiàng)活動(dòng)。
Storage:記錄了磁盤(pán)的活動(dòng)和文件的操作。
Memory:記錄了系統(tǒng)內(nèi)存的變化。
Power:記錄了電源相關(guān)的各種信息。
展開(kāi)Computation視圖后,可以看到CPUSTRES.EXE的CPU Weight百分比和Process Explorer看到的一致,50%左右。
Symbols
沒(méi)有符號(hào)文件的話,分析Xperf trace基本是找不到太多有用的信息的。
- 打開(kāi)WPA的Configure Symbol Paths窗口
2.Symbol Path:
srv*C:\Symols*http://msdl.microsoft.com/download/symbols;Y:\;
http://msdl.microsoft.com/download/symbols是微軟官方的symbol server,在load symbols后,WPA會(huì)把用到過(guò)的symbols文件下載到C:\Symbols,這樣用到過(guò)的symbols文件只會(huì)下載一次。Path通過(guò)分號(hào)(;)隔開(kāi),對(duì)于用戶自己的應(yīng)用程序,需要在path里面加上對(duì)應(yīng)版本的符號(hào)文件路徑。3.SymCache Path
WPA用SymCache文件來(lái)緩存PDB的符號(hào)信息,一旦ETL文件相關(guān)的PDB文件被緩存過(guò),對(duì)這個(gè)文件重新加載符號(hào)文件會(huì)快很多。
Loading Symbols之后,可以看到微軟自己的function stack都解析出來(lái)了,因?yàn)闆](méi)有CPUSTRES.EXE的符號(hào)文件,我們看不到具體的調(diào)用棧,以及是哪個(gè)函數(shù)造成的如此高的CPU占用。
如果這是你自己的應(yīng)用程序,通過(guò)加載符號(hào)文件后相信能夠很容易從代碼級(jí)別定位到問(wèn)題所在。當(dāng)然Xperf的trace并不是萬(wàn)能的,要想快速?gòu)谋姸嗟膱D表中找到關(guān)鍵信息,首先你得對(duì)要分析的性能問(wèn)題有個(gè)基本的判斷,是CPU問(wèn)題、內(nèi)存問(wèn)題、啟動(dòng)時(shí)間過(guò)長(zhǎng)還是啟動(dòng)失敗等等。有了發(fā)力的點(diǎn)才能從ETL文件中定位出有效的信息,我們也可以結(jié)合Xperf或wpaexporter導(dǎo)出的文本數(shù)據(jù)做更多自動(dòng)化方面的事情。
本章完~
TMQ連接:http://tmq.qq.com/
TMQ(騰訊移動(dòng)品質(zhì)中心)是騰訊最早專(zhuān)注在移動(dòng)APP測(cè)試的團(tuán)隊(duì)
我們專(zhuān)注于移動(dòng)測(cè)試技術(shù)精華,飽含騰訊多款億級(jí)APP的品質(zhì)秘密,文章皆獨(dú)家原創(chuàng),我們不談虛的,只談干貨!
掃碼關(guān)注我們
掃一掃 關(guān)注TMQ
精彩分享不斷
總結(jié)
以上是生活随笔為你收集整理的QQ浏览器性能提升之路-windows性能分析工具篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html5 启动qq,web启动本地QQ
- 下一篇: OTA 升级中的跟文件系统切换