Windows性能分析利器Xperf:從內(nèi)核事件追蹤到卡頓問(wèn)題定位
1. 從“卡頓”到“洞察”為什么你需要Xperf做性能優(yōu)化最怕的不是問(wèn)題復(fù)雜而是問(wèn)題“玄學(xué)”。用戶反饋“軟件偶爾會(huì)卡一下”開(kāi)發(fā)環(huán)境復(fù)現(xiàn)不了任務(wù)管理器里CPU和內(nèi)存占用看著也正常這時(shí)候怎么辦靠猜嗎在Windows平臺(tái)上當(dāng)你需要深入到內(nèi)核級(jí)別去追蹤那些轉(zhuǎn)瞬即逝的性能瓶頸、分析令人頭疼的卡頓掉幀、或是診斷一個(gè)偶發(fā)的系統(tǒng)級(jí)問(wèn)題時(shí)Xperf就是你手中那把最鋒利的手術(shù)刀。它不是任務(wù)管理器那種“體溫計(jì)”而是結(jié)合了“CT掃描”和“血液化驗(yàn)”功能的專(zhuān)業(yè)診斷工具集能讓你看到線程調(diào)度、磁盤(pán)I/O、硬中斷、DPC延遲、GPU活動(dòng)等底層事件的毫秒級(jí)詳情。很多人聽(tīng)說(shuō)過(guò)Windows Performance ToolkitWPT但面對(duì)其中眾多的工具如WPR、WPA和復(fù)雜的ETWEvent Tracing for Windows概念往往望而卻步覺(jué)得這是驅(qū)動(dòng)開(kāi)發(fā)或系統(tǒng)內(nèi)核工程師的領(lǐng)域。其實(shí)不然對(duì)于應(yīng)用開(kāi)發(fā)者、游戲開(kāi)發(fā)者、IT運(yùn)維甚至是對(duì)系統(tǒng)性能有追求的資深用戶掌握Xperf的基礎(chǔ)用法就相當(dāng)于獲得了一種“超能力”——將模糊的性能感知轉(zhuǎn)化為精確、可量化的數(shù)據(jù)證據(jù)。今天我就結(jié)合自己多年在游戲和大型客戶端性能調(diào)優(yōu)中踩過(guò)的坑帶你從零上手Xperf讓你下次面對(duì)性能問(wèn)題時(shí)不再說(shuō)“好像”而是能明確指出“看問(wèn)題出在這里這個(gè)線程的DPC延遲在磁盤(pán)寫(xiě)入時(shí)飆升到了15毫秒?!?. 工具準(zhǔn)備與環(huán)境搭建獲取你的性能分析“武器庫(kù)”工欲善其事必先利其器。使用Xperf的第一步是正確獲取和配置它。這里有幾個(gè)關(guān)鍵點(diǎn)直接關(guān)系到你后續(xù)使用的順暢度。2.1 獲取Windows Performance Toolkit (WPT)Xperf是WPT工具集里的命令行工具。獲取WPT最官方、最推薦的方式是通過(guò)Windows SDK安裝。但這里有個(gè)大坑不要安裝完整版的Windows SDK那有好幾個(gè)G我們只需要里面的WPT組件。推薦方法使用獨(dú)立安裝包微軟其實(shí)提供了WPT的獨(dú)立安裝包體積小安裝快。你可以直接訪問(wèn)微軟官方下載中心搜索“Windows Assessment and Deployment Kit”ADK在安裝時(shí)只勾選“Windows Performance Toolkit”這一個(gè)組件。這是最干凈的方法。備用方法從已安裝的SDK中提取如果你的系統(tǒng)上已經(jīng)安裝了Visual Studio它可能已經(jīng)附帶安裝了WPT。通常路徑在C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\。你可以直接把這個(gè)目錄添加到系統(tǒng)的PATH環(huán)境變量中這樣就能在命令行任意位置調(diào)用xperf、wpr等命令了。注意確保你的WPT版本與當(dāng)前系統(tǒng)版本大致匹配。雖然高版本工具通??梢苑治龅桶姹鞠到y(tǒng)捕獲的數(shù)據(jù)但最好還是使用與目標(biāo)分析系統(tǒng)相同或相近的版本以避免解析數(shù)據(jù)時(shí)出現(xiàn)未知錯(cuò)誤。2.2 以管理員身份運(yùn)行獲取必要的權(quán)限ETW事件跟蹤是Windows內(nèi)核級(jí)別的診斷基礎(chǔ)設(shè)施。要開(kāi)啟或監(jiān)聽(tīng)內(nèi)核事件必須擁有管理員權(quán)限。這意味著你用來(lái)運(yùn)行xperf命令的命令行窗口CMD或PowerShell必須“以管理員身份運(yùn)行”。右鍵點(diǎn)擊命令行圖標(biāo)選擇“以管理員身份運(yùn)行”這是一個(gè)必須養(yǎng)成的習(xí)慣否則你會(huì)遇到各種“訪問(wèn)被拒絕”的錯(cuò)誤。2.3 認(rèn)識(shí)核心工具xperf, wpr, wpa剛接觸時(shí)容易混淆我們先理清這幾個(gè)核心工具的分工xperf.exe 命令行工具功能強(qiáng)大且靈活。主要用于控制ETW會(huì)話的啟動(dòng)、停止以及合并生成的多個(gè)ETL日志文件。我們收集數(shù)據(jù)時(shí)最常用的是它。wpr.exe Windows Performance Recorder的命令行工具。它比xperf更“友好”一些使用預(yù)定義的配置文件.wprp來(lái)錄制數(shù)據(jù)。對(duì)于新手從WPR開(kāi)始可能更容易。wpa.exe Windows Performance Analyzer的圖形化界面工具。這是你分析和查看數(shù)據(jù)的主戰(zhàn)場(chǎng)。它功能極其強(qiáng)大可以加載ETL文件并以各種圖表、表格的形式展示數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō)xperf/wpr 負(fù)責(zé)“錄”收集數(shù)據(jù)wpa 負(fù)責(zé)“播”和“分析”查看分析數(shù)據(jù)。本文我們將聚焦于最經(jīng)典、最可控的xperf命令行收集方式。3. 核心場(chǎng)景與數(shù)據(jù)收集實(shí)戰(zhàn)手把手錄制你的第一份性能日志理論說(shuō)再多不如動(dòng)手跑一遍。我們從一個(gè)最經(jīng)典的場(chǎng)景開(kāi)始錄制一段包含CPU采樣、磁盤(pán)I/O、文件操作、網(wǎng)絡(luò)事件和上下文切換的完整性能日志用于分析一個(gè)卡頓問(wèn)題。3.1 基礎(chǔ)收集命令開(kāi)啟全局監(jiān)控假設(shè)我們想分析一個(gè)名為“MyApp.exe”的應(yīng)用程序在啟動(dòng)后30秒內(nèi)的性能表現(xiàn)。第一步啟動(dòng)一個(gè)后臺(tái)記錄會(huì)話打開(kāi)管理員權(quán)限的命令行導(dǎo)航到WPT目錄或確保其在PATH中。輸入以下命令xperf -on Base -f C:\Temp\trace.etl我們來(lái)拆解這個(gè)命令-on 表示“開(kāi)啟”on一個(gè)ETW會(huì)話。Base 這是一個(gè)預(yù)定義的關(guān)鍵字組。它包含了一系列最常用的基礎(chǔ)事件提供者如進(jìn)程/線程的創(chuàng)建銷(xiāo)毀、CPU采樣每毫秒一次、磁盤(pán)I/O、硬頁(yè)錯(cuò)誤等。對(duì)于大多數(shù)通用性能分析從Base開(kāi)始就足夠了。-f 指定輸出ETL文件的路徑。這里我們指定輸出到C:\Temp\trace.etl。請(qǐng)確保C:\Temp目錄存在或者你有權(quán)限寫(xiě)入目標(biāo)路徑。執(zhí)行后命令行會(huì)提示“xperf: warning: This trace will run until it is explicitly stopped...”這意味著記錄已經(jīng)開(kāi)始在后臺(tái)靜默運(yùn)行對(duì)系統(tǒng)性能影響極小通常1%。第二步執(zhí)行你的分析目標(biāo)現(xiàn)在你可以去操作你想要分析的程序了。比如啟動(dòng)“MyApp.exe”進(jìn)行一系列你覺(jué)得會(huì)卡頓的操作。第三步停止記錄并合并數(shù)據(jù)操作完成后回到管理員命令行輸入xperf -d C:\Temp\trace.etl-d 表示“停止”dump當(dāng)前正在運(yùn)行的、由xperf -on啟動(dòng)的全局會(huì)話并將數(shù)據(jù)保存到指定的ETL文件。這個(gè)命令會(huì)等待內(nèi)核將所有緩沖區(qū)的事件數(shù)據(jù)刷新到文件然后關(guān)閉會(huì)話?,F(xiàn)在你就得到了一個(gè)完整的性能日志文件C:\Temp\trace.etl。3.2 高級(jí)配置按需添加更多事件Base關(guān)鍵字很好但有時(shí)我們需要更具體的數(shù)據(jù)。Xperf的強(qiáng)大之處在于可以精確控制收集哪些提供者Provider的事件。ETW提供者就像一個(gè)個(gè)傳感器每個(gè)負(fù)責(zé)報(bào)告一類(lèi)信息。場(chǎng)景一分析音頻/視頻卡頓需要GPU和DWM事件xperf -on DiagEasy -f C:\Temp\graphics.etl這里使用了DiagEasy這個(gè)更強(qiáng)大的預(yù)定義組。它除了包含Base的所有內(nèi)容還額外添加了GPU活動(dòng)事件來(lái)自Microsoft-Windows-DxgKrnl。桌面窗口管理器事件Microsoft-Windows-Dwm-Core這對(duì)于分析UI渲染、幀率FPS至關(guān)重要。更多的電源管理、休眠恢復(fù)事件。場(chǎng)景二自定義提供者進(jìn)行極精細(xì)追蹤假設(shè)我們懷疑問(wèn)題與TCP/IP?;蚰硞€(gè)特定的Windows服務(wù)有關(guān)。我們可以手動(dòng)添加提供者xperf -on PROC_THREADLOADERCSWITCHDISK_IOHARD_FAULTS -stackwalk ProfileCSwitchReadyThread -f C:\Temp\detailed.etl這個(gè)命令看起來(lái)復(fù)雜其實(shí)結(jié)構(gòu)清晰-on后面跟的是啟用的事件關(guān)鍵字用連接PROC_THREAD: 進(jìn)程/線程事件。LOADER: 鏡像DLL/EXE加載事件。CSWITCH: 上下文切換事件。知道CPU時(shí)間片在哪個(gè)線程間切換是分析卡頓的黃金數(shù)據(jù)。DISK_IO: 磁盤(pán)輸入輸出事件。HARD_FAULTS: 硬頁(yè)錯(cuò)誤事件內(nèi)存缺頁(yè)需要從磁盤(pán)讀回。-stackwalk后面跟的是需要捕獲調(diào)用棧的事件用連接Profile: 為CPU采樣事件捕獲調(diào)用棧。這能告訴你采樣時(shí)CPU正在執(zhí)行哪個(gè)函數(shù)CSwitch: 為上下文切換事件捕獲調(diào)用棧。這能告訴你線程為什么被切換出去等鎖等I/O。ReadyThread: 為線程就緒事件捕獲調(diào)用棧。這是關(guān)鍵只有開(kāi)啟了-stackwalk后續(xù)在WPA中才能看到函數(shù)調(diào)用堆棧從而定位到代碼行級(jí)別的問(wèn)題。但注意捕獲調(diào)用棧會(huì)增加日志文件大小和CPU開(kāi)銷(xiāo)。停止命令和之前一樣xperf -d C:\Temp\detailed.etl實(shí)操心得不要一開(kāi)始就收集所有事件和調(diào)用棧。這會(huì)產(chǎn)生巨大的ETL文件動(dòng)輒數(shù)GB拖慢分析速度。應(yīng)該先使用Base或DiagEasy進(jìn)行廣度分析找到可疑的時(shí)間段和資源如某個(gè)磁盤(pán)活動(dòng)異常、某個(gè)進(jìn)程CPU占用高然后再針對(duì)性地設(shè)計(jì)更精細(xì)的收集方案縮小范圍并開(kāi)啟相關(guān)事件的調(diào)用棧捕獲。3.3 環(huán)形緩沖區(qū)與多文件記錄應(yīng)對(duì)長(zhǎng)時(shí)間或偶發(fā)問(wèn)題對(duì)于需要長(zhǎng)時(shí)間監(jiān)控如服務(wù)器或捕捉偶發(fā)問(wèn)題如一天只出現(xiàn)一次的卡頓的場(chǎng)景直接寫(xiě)單個(gè)文件可能不合適。這時(shí)可以使用環(huán)形緩沖區(qū)。xperf -start MySession -on Base -f C:\Temp\CircularBuffer.etl -maxfile 5 -filesize 500-start MySession: 啟動(dòng)一個(gè)名為“MySession”的會(huì)話方便后續(xù)控制。-maxfile 5: 設(shè)置最大文件數(shù)為5。-filesize 500: 設(shè)置每個(gè)文件最大500MB單位是MB。工作原理系統(tǒng)會(huì)持續(xù)記錄到CircularBuffer.etl寫(xiě)滿500MB后會(huì)重命名為CircularBuffer_1.etl并新建一個(gè)CircularBuffer.etl繼續(xù)寫(xiě)。當(dāng)有5個(gè)文件后最舊的文件CircularBuffer_4.etl會(huì)被覆蓋。這樣你總能保留最近一段時(shí)間5*500MB2.5GB數(shù)據(jù)量的記錄。停止并合并當(dāng)問(wèn)題發(fā)生時(shí)運(yùn)行xperf -stop MySession。然后你需要使用xperf -merge命令將多個(gè)文件合并成一個(gè)以便用WPA分析xperf -merge C:\Temp\CircularBuffer*.etl C:\Temp\MergedTrace.etl4. 使用WPA進(jìn)行數(shù)據(jù)分析從海量事件中挖掘?qū)毑厥占紼TL文件只是第一步真正的藝術(shù)在于分析。打開(kāi)WPAwpa.exe將你的trace.etl文件拖進(jìn)去你會(huì)看到一個(gè)類(lèi)似性能分析IDE的界面。4.1 初識(shí)界面與加載符號(hào)首次打開(kāi)文件WPA可能會(huì)提示“加載符號(hào)”。符號(hào)文件.pdb就像地圖能將內(nèi)存地址翻譯成函數(shù)名、源碼行號(hào)。沒(méi)有符號(hào)你看到的只是一堆十六進(jìn)制地址分析價(jià)值大打折扣。配置符號(hào)路徑點(diǎn)擊Trace-Configure Symbol Paths。典型設(shè)置SRV*C:\Symbols*https://msdl.microsoft.com/download/symbols: 這是微軟公共符號(hào)服務(wù)器用于解析系統(tǒng)DLL如ntoskrnl.exe的函數(shù)。添加你自己應(yīng)用程序的PDB文件所在目錄例如C:\MyApp\Release\*.pdb。點(diǎn)擊Trace-Load SymbolsWPA會(huì)開(kāi)始下載和加載符號(hào)這可能需要一些時(shí)間。4.2 核心分析視圖詳解WPA有幾十個(gè)分析視圖這里介紹幾個(gè)最常用、最能快速定位問(wèn)題的。4.2.1 CPU Usage (Sampled) 視圖這是分析CPU占用率的首要視圖。它通過(guò)每毫秒采樣所有CPU上正在執(zhí)行的線程來(lái)工作。怎么看在左側(cè)“Graph Explorer”中找到并雙擊打開(kāi)它。默認(rèn)視圖是“按進(jìn)程和線程”的占用率。關(guān)鍵操作縮放時(shí)間軸在下方的時(shí)間軸上用鼠標(biāo)拖拽選擇你感興趣的時(shí)間段比如卡頓發(fā)生的幾秒鐘。關(guān)聯(lián)棧標(biāo)簽這是最強(qiáng)大的功能。在表格區(qū)域右鍵點(diǎn)擊某個(gè)高CPU占用的線程選擇“View Stacks” - “By Thread”。右側(cè)會(huì)彈出調(diào)用棧窗口。解讀調(diào)用棧在調(diào)用棧窗口中選擇“Call Tree”標(biāo)簽。你會(huì)看到一個(gè)樹(shù)狀結(jié)構(gòu)根部是采樣次數(shù)最多的函數(shù)。從下往上讀你可以清晰地看到這個(gè)線程大部分時(shí)間在執(zhí)行哪個(gè)函數(shù)路徑。如果這是你的代碼你就能立刻定位到熱點(diǎn)函數(shù)。常見(jiàn)問(wèn)題定位CPU占用高但無(wú)卡頓可能是某個(gè)后臺(tái)計(jì)算線程。CPU占用不高但感覺(jué)卡問(wèn)題可能不在CPU轉(zhuǎn)到其他視圖。4.2.2 Computation 視圖下的 DPC/ISR 和 ReadyThread這是診斷系統(tǒng)延遲和“系統(tǒng)卡頓”的利器。DPCDeferred Procedure Call和 ISRInterrupt Service Routine它們是高優(yōu)先級(jí)的內(nèi)核例程用于處理硬件中斷等。如果某個(gè)DPC執(zhí)行時(shí)間過(guò)長(zhǎng)例如超過(guò)1毫秒它會(huì)阻塞所有用戶態(tài)線程導(dǎo)致系統(tǒng)整體響應(yīng)遲鈍。怎么看在“Computation”分類(lèi)下找到“DPC and ISR CPU Usage”。如果看到有柱狀圖特別高持續(xù)時(shí)間長(zhǎng)就需要警惕。關(guān)聯(lián)分析右鍵點(diǎn)擊高DPC查看其調(diào)用棧。常見(jiàn)的罪魁禍?zhǔn)资怯袉?wèn)題的驅(qū)動(dòng)程序特別是顯卡、聲卡、網(wǎng)卡、殺毒軟件的驅(qū)動(dòng)。調(diào)用棧會(huì)顯示是哪個(gè)驅(qū)動(dòng)模塊.sys文件里的函數(shù)耗時(shí)。ReadyThread這個(gè)視圖顯示了線程在“就緒”狀態(tài)即等待被CPU調(diào)度下等待了多久。如果一個(gè)用戶界面線程“就緒”了很久才被調(diào)度用戶就會(huì)感到卡頓。結(jié)合上下文切換CSwitch事件的調(diào)用??梢苑治鏊鼮槭裁催t遲得不到CPU。4.2.3 Disk I/O 視圖當(dāng)你的應(yīng)用在文件保存、加載資源時(shí)卡住一定要看這里。怎么看找到“Storage” - “Disk I/O Usage”。關(guān)鍵列Process: 發(fā)起I/O的進(jìn)程。Path: 讀寫(xiě)的文件路徑。Response Time (us):響應(yīng)時(shí)間這是關(guān)鍵指標(biāo)單位是微秒。一個(gè)正常的磁盤(pán)操作響應(yīng)時(shí)間通常在幾百微秒到幾毫秒。如果你看到大量的I/O響應(yīng)時(shí)間在幾十甚至上百毫秒說(shuō)明磁盤(pán)遇到了瓶頸可能是機(jī)械硬盤(pán)尋道慢或者是發(fā)生了磁盤(pán)隊(duì)列積壓。Size: I/O請(qǐng)求的大小。分析思路找到響應(yīng)時(shí)間異常高的I/O操作看是哪個(gè)進(jìn)程、哪個(gè)文件。如果是你的應(yīng)用在頻繁讀寫(xiě)小文件考慮合并讀寫(xiě)或使用緩存。如果是殺毒軟件在掃描你的工作目錄可以考慮將其排除。4.2.4 Generic Events 視圖與自定義標(biāo)記你可以在自己的代碼中插入ETW事件這樣它們就會(huì)出現(xiàn)在這個(gè)視圖里作為你分析的時(shí)間標(biāo)尺。在代碼中C/C使用EventWriteAPI 或TraceLoggingAPI。在WPA中在“Generic Events”視圖中你可以看到這些自定義事件及其負(fù)載數(shù)據(jù)。你可以將它們拖到時(shí)間軸上清晰地標(biāo)記出“用戶點(diǎn)擊了按鈕”、“開(kāi)始加載關(guān)卡”、“網(wǎng)絡(luò)請(qǐng)求發(fā)送”等關(guān)鍵業(yè)務(wù)節(jié)點(diǎn)從而將系統(tǒng)級(jí)的性能數(shù)據(jù)與你的應(yīng)用邏輯精確對(duì)齊。4.3 分析工作流與技巧由表及里逐層深入不要一上來(lái)就鉆調(diào)用棧。先看整體時(shí)間線找到卡頓發(fā)生的精確時(shí)間段通常表現(xiàn)為CPU使用率驟變、GPU隊(duì)列積壓、磁盤(pán)響應(yīng)時(shí)間尖峰。關(guān)聯(lián)分析WPA支持強(qiáng)大的關(guān)聯(lián)功能。在時(shí)間軸上選中一個(gè)時(shí)間段然后切換到其他視圖你會(huì)發(fā)現(xiàn)數(shù)據(jù)自動(dòng)過(guò)濾到只顯示該時(shí)間段內(nèi)的活動(dòng)。例如在CPU視圖中選中一個(gè)CPU使用高峰然后切換到Disk I/O視圖看看同一時(shí)間是否有大量的磁盤(pán)活動(dòng)。保存分析布局當(dāng)你配置好一組常用的視圖和過(guò)濾器后可以將其保存為.wpaprofile文件。下次分析同類(lèi)問(wèn)題時(shí)直接加載這個(gè)配置文件能極大提升效率。比較兩個(gè)跟蹤文件WPA可以同時(shí)加載兩個(gè)ETL文件例如一個(gè)“正?!钡母櫼粋€(gè)“有問(wèn)題”的跟蹤并將它們的圖表疊加顯示方便進(jìn)行對(duì)比分析快速定位差異。5. 常見(jiàn)問(wèn)題排查與實(shí)戰(zhàn)心得理論掌握了工具也會(huì)用了但在實(shí)戰(zhàn)中還是會(huì)遇到各種稀奇古怪的問(wèn)題。這里分享一些我踩過(guò)的坑和對(duì)應(yīng)的解決方案。5.1 數(shù)據(jù)收集類(lèi)問(wèn)題問(wèn)題1運(yùn)行xperf -on命令時(shí)報(bào)錯(cuò)“Access is denied”。原因百分之百是因?yàn)闆](méi)有使用管理員權(quán)限的命令行。ETW需要內(nèi)核權(quán)限。解決關(guān)閉當(dāng)前命令行重新以管理員身份運(yùn)行CMD或PowerShell。問(wèn)題2生成的ETL文件非常大幾十GBWPA打開(kāi)極慢甚至崩潰。原因開(kāi)啟了過(guò)多的事件提供者尤其是開(kāi)啟了大量事件的調(diào)用棧-stackwalk并且記錄時(shí)間過(guò)長(zhǎng)。解決精準(zhǔn)收集如前所述先進(jìn)行廣度分析再針對(duì)性開(kāi)啟事件和調(diào)用棧??刂茣r(shí)長(zhǎng)盡量只錄制問(wèn)題復(fù)現(xiàn)的關(guān)鍵時(shí)間段。使用過(guò)濾器高級(jí)用法中xperf支持通過(guò)-f過(guò)濾器來(lái)只收集特定進(jìn)程的事件但這需要更復(fù)雜的命令。分析時(shí)過(guò)濾在WPA中打開(kāi)大文件后可以先在時(shí)間軸上選取一個(gè)小的、關(guān)鍵的時(shí)間段進(jìn)行分析避免一次性加載全部數(shù)據(jù)。問(wèn)題3在WPA中看不到自己應(yīng)用程序的函數(shù)名只有模塊地址。原因符號(hào)文件PDB沒(méi)有正確加載。解決確認(rèn)符號(hào)路徑配置正確包含了你應(yīng)用程序PDB的路徑。確保你加載的ETL文件是在同一臺(tái)機(jī)器、同一個(gè)程序版本上捕獲的。如果是在客戶機(jī)器上抓的日志你需要拿到客戶機(jī)器上對(duì)應(yīng)版本的程序PDB文件。點(diǎn)擊Trace-Load Symbols并查看輸出窗口是否有錯(cuò)誤信息。5.2 數(shù)據(jù)分析類(lèi)問(wèn)題問(wèn)題4卡頓發(fā)生時(shí)CPU使用率很低Disk I/O也不高問(wèn)題在哪排查方向檢查DPC/ISR這是最可能的原因。去“DPC and ISR CPU Usage”視圖看是否有長(zhǎng)時(shí)間的DPC執(zhí)行。檢查鎖競(jìng)爭(zhēng)如果多個(gè)線程在激烈競(jìng)爭(zhēng)同一個(gè)鎖它們可能大部分時(shí)間處于等待狀態(tài)WAIT而不是運(yùn)行狀態(tài)RUNNING。這不會(huì)顯著推高CPU使用率但會(huì)導(dǎo)致程序停滯。查看“ReadyThread”和“Context Switch”視圖關(guān)注線程的等待鏈。檢查GPU如果是圖形應(yīng)用去“GPU Usage”視圖看GPU引擎是否飽和或者命令隊(duì)列是否積壓。GPU瓶頸不會(huì)體現(xiàn)在CPU使用率上。檢查內(nèi)存查看“Memory” - “Hard Faults”視圖。如果硬頁(yè)錯(cuò)誤頻繁說(shuō)明物理內(nèi)存不足系統(tǒng)在頻繁地進(jìn)行頁(yè)面交換使用磁盤(pán)虛擬內(nèi)存這會(huì)導(dǎo)致間歇性卡頓。問(wèn)題5如何確定一個(gè)高CPU的線程是不是問(wèn)題的根源方法不僅要看它占用了多少CPU還要看它在做什么。這就是調(diào)用棧的作用。步驟在CPU Usage視圖中找到高CPU線程查看其調(diào)用棧。如果調(diào)用棧顯示它正在執(zhí)行一個(gè)合理的、預(yù)期的任務(wù)例如視頻編碼、物理模擬那么它可能只是“忙得有理”。如果調(diào)用棧顯示它卡在一個(gè)鎖等待、一個(gè)低效的算法循環(huán)、或一個(gè)空轉(zhuǎn)spin-wait中那么它就是需要優(yōu)化的目標(biāo)。問(wèn)題6分析網(wǎng)絡(luò)延遲問(wèn)題應(yīng)該關(guān)注哪些事件基礎(chǔ)事件NETWORKTRACE關(guān)鍵字可以提供TCP/UDP事件。更佳選擇對(duì)于深入的網(wǎng)絡(luò)分析建議使用netsh命令的trace功能或者使用更專(zhuān)業(yè)的網(wǎng)絡(luò)抓包工具如Wireshark。ETW在網(wǎng)絡(luò)層面的深度不如專(zhuān)門(mén)的網(wǎng)絡(luò)工具但可以結(jié)合進(jìn)程、線程事件幫你關(guān)聯(lián)是哪個(gè)應(yīng)用的哪個(gè)線程在發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí)發(fā)生了延遲。5.3 高級(jí)技巧與心得建立性能基線在系統(tǒng)運(yùn)行良好時(shí)錄制一份“健康”的ETL日志作為基線。當(dāng)出現(xiàn)問(wèn)題后將問(wèn)題日志與基線日志在WPA中進(jìn)行對(duì)比差異點(diǎn)往往就是問(wèn)題所在。腳本化收集對(duì)于需要反復(fù)進(jìn)行的收集任務(wù)比如每日自動(dòng)化性能測(cè)試可以將xperf命令寫(xiě)成批處理腳本或PowerShell腳本一鍵啟動(dòng)和停止并自動(dòng)重命名日志文件。關(guān)注“空閑”進(jìn)程系統(tǒng)中斷Interrupts和DPC在任務(wù)管理器中可能被歸到“System”或“Interrupts”進(jìn)程下但在WPA的CPU視圖中它們有獨(dú)立的顯示。一個(gè)看似“空閑”的系統(tǒng)可能正被糟糕的驅(qū)動(dòng)產(chǎn)生的DPC所拖累。理解開(kāi)銷(xiāo)開(kāi)啟ETW跟蹤本身有極小開(kāi)銷(xiāo)通常1% CPU少量?jī)?nèi)存用于事件緩沖區(qū)。但在生產(chǎn)環(huán)境長(zhǎng)時(shí)間、全量開(kāi)啟仍需謹(jǐn)慎。對(duì)于生產(chǎn)環(huán)境應(yīng)考慮使用環(huán)形緩沖區(qū)并只開(kāi)啟最關(guān)鍵的事件。性能分析就像破案Xperf和WPA給了你一個(gè)超級(jí)顯微鏡和一臺(tái)時(shí)間機(jī)器讓你能回到“案發(fā)現(xiàn)場(chǎng)”查看每一個(gè)細(xì)節(jié)。最初的學(xué)習(xí)曲線可能有點(diǎn)陡峭但一旦掌握了基本流程和核心視圖的分析方法你解決復(fù)雜性能問(wèn)題的能力將獲得質(zhì)的飛躍。從今天起試著用它來(lái)分析一次你電腦上某個(gè)程序的啟動(dòng)過(guò)程吧你會(huì)發(fā)現(xiàn)一個(gè)你從未真正了解過(guò)的、繁忙而有序的Windows世界。

相關(guān)新聞

PyQt6桌面應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)與源碼解析

PyQt6桌面應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)與源碼解析

1. PyQt6工程源碼解析與實(shí)戰(zhàn)應(yīng)用作為一名長(zhǎng)期使用PyQt進(jìn)行桌面應(yīng)用開(kāi)發(fā)的程序員,我深知一個(gè)完整工程源碼對(duì)初學(xué)者和進(jìn)階開(kāi)發(fā)者的價(jià)值。今天分享的這套PyQt6工程源碼,不僅包含了基礎(chǔ)框架搭建,還整合了數(shù)據(jù)增刪查改、UI交互等核心功能模塊。這個(gè)…

2026/8/3 7:28:37 閱讀更多
制造業(yè)ERP系統(tǒng)架構(gòu)設(shè)計(jì)與C#關(guān)鍵技術(shù)實(shí)現(xiàn)

制造業(yè)ERP系統(tǒng)架構(gòu)設(shè)計(jì)與C#關(guān)鍵技術(shù)實(shí)現(xiàn)

1. 制造業(yè)ERP系統(tǒng)架構(gòu)設(shè)計(jì)要點(diǎn) 制造業(yè)ERP系統(tǒng)與傳統(tǒng)ERP的最大區(qū)別在于需要深度整合生產(chǎn)執(zhí)行系統(tǒng)(MES)功能。我在為某汽車(chē)零部件廠商設(shè)計(jì)系統(tǒng)時(shí),采用分層架構(gòu)模式: 1.1 核心模塊劃分 生產(chǎn)管理層 :包含工藝路線管理(BOM多級(jí)展開(kāi)效…

2026/8/3 7:18:37 閱讀更多
Python基礎(chǔ)數(shù)據(jù)類(lèi)型詳解:整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù)與布爾型

Python基礎(chǔ)數(shù)據(jù)類(lèi)型詳解:整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù)與布爾型

1. Python基礎(chǔ)數(shù)據(jù)類(lèi)型概述 剛接觸Python時(shí),最讓我困惑的就是各種數(shù)據(jù)類(lèi)型的區(qū)別和使用場(chǎng)景。記得第一次寫(xiě)計(jì)算器程序時(shí),因?yàn)闆](méi)搞清楚整數(shù)和浮點(diǎn)數(shù)的區(qū)別,導(dǎo)致計(jì)算結(jié)果總是出錯(cuò)。經(jīng)過(guò)多年實(shí)戰(zhàn),我總結(jié)出Python數(shù)據(jù)類(lèi)型就像工具箱里…

2026/8/3 9:08:40 閱讀更多
80小時(shí)法則:提升項(xiàng)目管理效率的關(guān)鍵策略

80小時(shí)法則:提升項(xiàng)目管理效率的關(guān)鍵策略

1. 項(xiàng)目管理效率革命的底層邏輯80小時(shí)法則項(xiàng)目管理工具的核心在于將傳統(tǒng)項(xiàng)目管理中的"時(shí)間黑洞"可視化。我在帶領(lǐng)多個(gè)跨部門(mén)項(xiàng)目時(shí)發(fā)現(xiàn),約73%的延期問(wèn)題都源于對(duì)隱性時(shí)間成本的錯(cuò)誤預(yù)估。這個(gè)工具通過(guò)量化每個(gè)任務(wù)節(jié)點(diǎn)的真實(shí)耗時(shí),建立起動(dòng)態(tài)的…

2026/8/3 9:08:40 閱讀更多
Unity角色移動(dòng)優(yōu)化:從Input.GetKey到GetAxis的絲滑手感實(shí)現(xiàn)

Unity角色移動(dòng)優(yōu)化:從Input.GetKey到GetAxis的絲滑手感實(shí)現(xiàn)

1. 項(xiàng)目概述:從“一頓一頓”到“行云流水”的移動(dòng)體驗(yàn) 做Unity游戲開(kāi)發(fā),尤其是動(dòng)作類(lèi)、平臺(tái)跳躍類(lèi)或者任何需要精細(xì)操控的項(xiàng)目,角色的移動(dòng)手感是玩家體驗(yàn)的第一道門(mén)檻。很多新手,甚至一些有一定經(jīng)驗(yàn)的開(kāi)發(fā)者,在實(shí)現(xiàn)角色…

2026/8/3 8:58:39 閱讀更多
全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎,我們逆向拆解了它的字段置信度熔斷機(jī)制

全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎,我們逆向拆解了它的字段置信度熔斷機(jī)制

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:全球僅7家廠商通過(guò)ISO/IEC 27001認(rèn)證的名片AI引擎概覽 名片AI引擎是企業(yè)級(jí)智能文檔處理的核心組件,專(zhuān)注于高精度OCR、語(yǔ)義結(jié)構(gòu)化提取與跨語(yǔ)言實(shí)體對(duì)齊。截至2024年第三季度,全球范圍內(nèi)僅…

2026/8/3 0:07:47 閱讀更多
Dism++系統(tǒng)優(yōu)化實(shí)戰(zhàn):3大場(chǎng)景深度清理Windows性能瓶頸

Dism++系統(tǒng)優(yōu)化實(shí)戰(zhàn):3大場(chǎng)景深度清理Windows性能瓶頸

Dism系統(tǒng)優(yōu)化實(shí)戰(zhàn):3大場(chǎng)景深度清理Windows性能瓶頸 【免費(fèi)下載鏈接】Dism-Multi-language Dism Multi-language Support & BUG Report 項(xiàng)目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款基于微軟底層技術(shù)的專(zhuān)業(yè)Windows系統(tǒng)優(yōu)…

2026/8/3 0:07:47 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類(lèi)短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/3 7:44:46 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專(zhuān)用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多