dtrace 是一個非常強大的系統追蹤工具,常用於效能分析、除錯和系統行為監控。透過其豐富的命令列選項,使用者可以靈活地定製追蹤過程,分析系統中的各類事件與行為。

suv789發表於2024-11-24

Windows 上的 DTrace - Windows drivers | Microsoft Learn

DTrace | Microsoft Learn

Download DTrace On Windows from Official Microsoft Download Center 2.0版本下載

GitHub - microsoft/DTrace-on-Windows: Code for the cross platform, single source, OpenDTrace implementation

DTrace

Windows Server 2025 配備了 dtrace 作為本機工具。 DTrace 是一款命令列實用工具,可讓使用者實時監控系統效能並排除故障。 DTrace 允許使用者動態檢測核心和使用者空間程式碼,而無需修改程式碼本身。 此多功能工具支援一系列資料收集和分析技術,如聚合、直方圖和使用者級事件跟蹤。 若要了解詳細資訊,請參閱 DTrace 獲取命令列幫助,參閱 Windows 上的 DTrace 瞭解其他功能。


dtrace 是一個強大的動態追蹤工具,廣泛用於效能分析、除錯和監控系統行為。它允許使用者以低開銷、動態的方式追蹤作業系統、應用程式和核心的執行情況。根據不同的使用場景和功能需求,dtrace 可以分為幾個主要的功能類別:

1. 系統效能分析

dtrace 可以幫助使用者分析系統的效能瓶頸,識別資源消耗大的地方。它透過動態地監控核心、程序、執行緒、檔案系統、網路等子系統的行為,幫助使用者找出系統效能問題。

  • CPU 和記憶體效能:監控 CPU 佔用情況,分析記憶體分配和釋放、快取命中率等。
  • 系統呼叫追蹤:透過 dtrace 可以追蹤系統呼叫的執行情況,幫助理解系統呼叫的效率及其對效能的影響。
  • 應用程式效能:分析應用程式執行過程中的瓶頸,幫助開發人員最佳化程式碼。

2. 動態事件追蹤

dtrace 是基於事件驅動的,透過監控核心和使用者空間的特定事件,幫助開發人員瞭解系統的執行狀態。常見的事件包括函式呼叫、記憶體分配、I/O 操作等。

  • 探針機制dtrace 使用探針(probe)來捕捉特定事件。每個探針關聯一個事件,可以是函式入口、退出,或者是特定系統呼叫的發生。
  • 事件過濾:使用者可以根據需要過濾和定製感興趣的事件,使用條件表示式和操作進行更細粒度的追蹤。

3. 故障診斷與除錯

dtrace 可以幫助開發人員定位系統中的故障和問題,尤其是在動態執行時環境下。它透過提供深入的核心和使用者空間資訊,幫助開發人員理解系統行為並進行除錯。

  • 崩潰追蹤:在程式崩潰或系統出現問題時,dtrace 可以幫助確定崩潰的原因和位置。
  • 資源洩漏檢測:透過監控記憶體分配和檔案控制代碼使用情況,dtrace 能幫助開發人員識別和修復資源洩漏問題。
  • 死鎖和競爭條件檢測:分析多執行緒或多程序程式中的死鎖或競態條件。

4. 核心級追蹤

dtrace 具有強大的核心級追蹤能力,能夠直接監控和分析作業系統核心的行為,幫助開發人員理解核心的操作和效能。

  • 核心函式呼叫追蹤:可以追蹤核心函式的呼叫情況,分析核心中的效能瓶頸或錯誤。
  • 記憶體管理追蹤:分析核心中記憶體分配、釋放和頁面交換的行為,幫助除錯記憶體管理問題。
  • 檔案系統追蹤:監控檔案系統操作,如檔案開啟、讀取、寫入等,幫助分析檔案系統的效能或錯誤。

5. 使用者空間追蹤

dtrace 不僅可以追蹤核心級事件,還可以用於監控和分析使用者空間中的程序行為。它能動態地插入探針到執行中的應用程式中,分析其行為。

  • 程序/執行緒分析:透過監控程序或執行緒的生命週期,分析其執行狀態、CPU 使用情況和資源消耗。
  • 函式級別追蹤:在使用者空間,dtrace 可以追蹤函式呼叫的入口、出口及引數,幫助開發人員進行精細化除錯和效能分析。

6. 安全性和審計

dtrace 可以作為一種安全審計工具,用於監控系統中的可疑行為,幫助分析潛在的安全問題。

  • 異常檢測:監控系統中的異常行為,如未知系統呼叫或非授權的檔案訪問,幫助及時發現潛在的安全漏洞。
  • 訪問控制審計:追蹤檔案、網路資源等訪問情況,確保系統的安全性和合規性。
  • 攻擊檢測:透過對系統資源使用情況、程序行為等的分析,檢測潛在的攻擊或惡意行為。

7. 自定義指令碼支援

dtrace 提供了強大的指令碼支援,使用者可以編寫自定義指令碼來定義複雜的事件捕獲和分析規則。D 語言是一種專門為 dtrace 設計的語言,用於編寫這些指令碼。

  • 指令碼化事件:使用者可以透過 D 語言編寫指令碼,定義在特定事件發生時要執行的操作。
  • 複雜事件檢測:透過指令碼,使用者可以定義複雜的邏輯來分析多個事件的組合,甚至基於事件的順序和時延來檢測問題。

8. 可擴充套件性和整合

dtrace 允許與其他工具和系統進行整合,增強其功能和適用範圍。

  • 與效能分析工具整合:可以與 perfvmstatiotop 等工具配合使用,提供更全面的系統效能分析。
  • 與日誌系統整合:將追蹤結果整合到日誌管理系統中,進行更長時間的歷史資料分析。
  • 支援多種作業系統dtrace 不僅支援 Solaris,還支援 macOS 和部分 Linux 發行版,具有較強的跨平臺能力。

總結:

dtrace 的功能可以大致分為以下幾類:

  1. 系統效能分析:CPU、記憶體、I/O 等資源的效能分析。
  2. 動態事件追蹤:監控和捕捉系統事件,幫助進行效能調優和故障排查。
  3. 故障診斷與除錯:定位系統和應用程式中的問題,進行深度除錯。
  4. 核心級追蹤:對作業系統核心的深入分析和除錯。
  5. 使用者空間追蹤:對執行中的應用程式進行詳細的監控。
  6. 安全性和審計:用於安全監控、異常檢測和訪問控制審計。
  7. 自定義指令碼支援:透過編寫 D 指令碼實現自定義事件捕獲與分析。
  8. 可擴充套件性和整合:支援與其他工具的整合,增強功能。

這些功能使得 dtrace 成為一個非常強大且靈活的工具,廣泛用於效能調優、故障排查、系統監控等多個領域。


dtrace -V
dtrace: Sun D 1.13.1

dtrace 命令使用說明:

Copy Code
用法: dtrace [-BCeFhlqSvVwYZ] [-b bufsz] [-c cmd] [-D name[=def]]
        [-I path] [-L path] [-o output] [-p pid] [-s script] [-U name]
        [-x opt[=val]] [-X a|c|s|t] [-y symbol path]

        [-P provider [[ predicate ] action ]]
        [-m [ provider: ] module [[ predicate ] action ]]
        [-f [[ provider: ] module: ] func [[ predicate ] action ]]
        [-n [[[ provider: ] module: ] func: ] name [[ predicate ] action ]]
        [-i probe-id [[ predicate ] action ]] [ args ... ]

        predicate -> '/' D 表示式 '/'
        action -> '{' D 語句 '}'

        -b  設定追蹤緩衝區大小
        -c  執行指定命令並在命令完成後退出
        -C  對指令碼檔案執行 ucpp 前處理器
        -D  在呼叫前處理器時定義符號
        -e  在編譯請求後但啟用探針前退出
        -f  啟用或列出匹配指定函式名的探針
        -F  按函式合併追蹤輸出
        -h  生成包含靜態探針定義的標頭檔案
        -i  啟用或列出匹配指定探針 ID 的探針
        -I  將包含目錄新增到前處理器的搜尋路徑
        -l  列出匹配指定條件的探針
        -L  將庫目錄新增到庫搜尋路徑
        -m  啟用或列出匹配指定模組名的探針
        -n  啟用或列出匹配指定探針名的探針
        -o  設定輸出檔案
        -p  獲取指定的程序 ID 並快取其符號表
        -P  啟用或列出匹配指定提供者名的探針
        -q  設定靜默模式(僅輸出明確的追蹤資料)
        -s  根據指定的 D 指令碼啟用或列出探針
        -S  列印 D 編譯器中間程式碼
        -U  在呼叫前處理器時取消定義符號
        -v  設定詳細模式(報告穩定性屬性、引數)
        -V  報告 DTrace API 版本
        -w  允許執行破壞性操作
        -x  啟用或修改編譯器和追蹤選項
        -y  設定符號搜尋路徑
        -Y  使用預設的符號搜尋路徑
        -Z  允許匹配零個探針的探針描述

引數說明:

  • -b bufsz
    設定追蹤緩衝區的大小,用於調整 dtrace 的記憶體使用。

  • -c cmd
    執行指定的命令並在其完成後退出。常用於分析特定命令的效能。

  • -C
    對指令碼檔案執行 C 前處理器處理,通常用於處理 D 語言指令碼中的宏。

  • -D name[=def]
    在呼叫前處理器時定義符號。可以用於修改指令碼的編譯行為。

  • -e
    在編譯請求後但啟用探針之前退出,通常用於驗證指令碼的正確性。

  • -f
    啟用或列出匹配指定函式名稱的探針。

  • -F
    按函式合併追蹤輸出。幫助分析函式級別的行為。

  • -h
    生成靜態探針定義的標頭檔案,用於進一步的整合或分析。

  • -i probe-id
    啟用或列出匹配指定探針 ID 的探針。

  • -I path
    向前處理器新增包含目錄,使其能夠在指定目錄中查詢標頭檔案。

  • -l
    列出匹配指定條件的探針,幫助使用者快速檢視可用的探針。

  • -L path
    向庫搜尋路徑新增目錄,使其能夠在指定的庫路徑中查詢所需的庫。

  • -m
    啟用或列出匹配指定模組名的探針。

  • -n
    啟用或列出匹配指定探針名的探針。

  • -o output
    設定輸出檔案,將追蹤資料輸出到指定檔案中。

  • -p pid
    獲取指定的程序 ID,並快取其符號表。適用於針對特定程序的追蹤。

  • -P provider
    啟用或列出匹配指定提供者名稱的探針。

  • -q
    設定為靜默模式,只輸出明確的追蹤資料,忽略其他資訊。

  • -s script
    根據指定的 D 語言指令碼啟用或列出探針。D 指令碼是 dtrace 自定義追蹤的核心。

  • -S
    列印 D 編譯器的中間程式碼,用於除錯或檢視編譯過程。

  • -U name
    在呼叫前處理器時取消定義符號,通常用於指令碼中清理符號定義。

  • -v
    啟用詳細模式,報告探針的穩定性屬性和引數資訊。

  • -V
    輸出 dtrace API 的版本資訊。

  • -w
    允許執行可能導致系統狀態改變或其他破壞性操作的命令。

  • -x opt[=val]
    啟用或修改編譯器和追蹤選項,用於自定義行為或調優效能。

  • -y symbol path
    設定符號搜尋路徑,指定搜尋符號的目錄位置。

  • -Y
    使用預設的符號搜尋路徑,通常是系統預設的庫路徑。

  • -Z
    允許匹配零個探針的探針描述。用於開發或診斷階段。

總結:

dtrace 是一個非常強大的系統追蹤工具,常用於效能分析、除錯和系統行為監控。透過其豐富的命令列選項,使用者可以靈活地定製追蹤過程,分析系統中的各類事件與行為。

dtrace
Usage: dtrace [-BCeFhlqSvVwYZ] [-b bufsz] [-c cmd] [-D name[=def]]
[-I path] [-L path] [-o output] [-p pid] [-s script] [-U name]
[-x opt[=val]] [-X a|c|s|t] [-y symbol path]

[-P provider [[ predicate ] action ]]
[-m [ provider: ] module [[ predicate ] action ]]
[-f [[ provider: ] module: ] func [[ predicate ] action ]]
[-n [[[ provider: ] module: ] func: ] name [[ predicate ] action ]]
[-i probe-id [[ predicate ] action ]] [ args ... ]

predicate -> '/' D-expression '/'
action -> '{' D-statements '}'

-b set trace buffer size
-c run specified command and exit upon its completion
-C run ucpp preprocessor on script files
-D define symbol when invoking preprocessor
-e exit after compiling request but prior to enabling probes
-f enable or list probes matching the specified function name
-F coalesce trace output by function
-h generate a header file with definitions for static probes
-i enable or list probes matching the specified probe id
-I add include directory to preprocessor search path
-l list probes matching specified criteria
-L add library directory to library search path
-m enable or list probes matching the specified module name
-n enable or list probes matching the specified probe name
-o set output file
-p grab specified process-ID and cache its symbol tables
-P enable or list probes matching the specified provider name
-q set quiet mode (only output explicitly traced data)
-s enable or list probes according to the specified D script
-S print D compiler intermediate code
-U undefine symbol when invoking preprocessor
-v set verbose mode (report stability attributes, arguments)
-V report DTrace API version
-w permit destructive actions
-x enable or modify compiler and tracing options
-y set symbol search path
-Y use default symbol search path
-Z permit probe descriptions that match zero probes

Windows Server 上進行類似於 dtrace 的操作,可以考慮以下幾個工具:

1. Windows Performance Toolkit (WPT) 和 Windows Performance Recorder (WPR)

Windows 提供了一個強大的效能分析工具集,名為 Windows Performance Toolkit (WPT),其中包括 Windows Performance Recorder (WPR) 和 Windows Performance Analyzer (WPA)。你可以用這些工具來捕獲和分析系統事件和效能瓶頸。

示例:記錄系統效能事件

  1. 啟動 Windows Performance Recorder(WPR)。
  2. 選擇 CPU UsageDisk IOMemory Usage 等跟蹤選項。
  3. 點選 Start,然後執行你想要分析的操作。
  4. 點選 Stop 完成效能取樣,結果會生成一個 .etl 檔案。
  5. 使用 Windows Performance Analyzer (WPA) 開啟 .etl 檔案進行分析。

2. Process Monitor (ProcMon)

Process Monitor 是另一個非常強大的 Windows 工具,可以用來監控檔案系統、登錄檔、程序、執行緒等事件。它類似於 dtrace 的一種資料捕獲和事件監控工具。

示例:捕獲檔案操作和登錄檔訪問

  1. 啟動 Process Monitor
  2. 配置過濾器,僅捕獲你感興趣的事件(如檔案系統操作、登錄檔訪問等)。
  3. 開始捕獲資料並執行你需要分析的操作。
  4. 停止捕獲並分析日誌。

3. Windows Debugging Tools (WinDbg)

WinDbg 是一個高階除錯工具,適用於 Windows 應用程式、核心、驅動程式等。你可以用它來進行低階別的故障排查、堆疊跟蹤和記憶體分析。

示例:使用 WinDbg 捕獲堆疊資訊

  1. 啟動 WinDbg,並連線到目標系統。
  2. 使用 !analyze -v 命令來分析崩潰轉儲檔案,或者使用 !process 命令檢視程序資訊。
  3. 除錯核心或應用程式崩潰、效能瓶頸等。

4. ETW (Event Tracing for Windows)

ETW 是 Windows 提供的一個高效的事件跟蹤機制,允許你捕獲系統級別的事件,類似於 dtrace 提供的功能。透過 ETW,你可以收集關於系統、應用程式、硬體的詳細資訊,並進行效能分析。

示例:使用 ETW 跟蹤系統呼叫

你可以透過 logmanxperf 等工具來捕獲 ETW 事件。

bashCopy Code
logman start MyTrace -p "Microsoft-Windows-Sysmon" 0xFFFFFFFF -ets

解釋:

  • logman 用於啟動 ETW 跟蹤。
  • -p "Microsoft-Windows-Sysmon" 指定跟蹤 Sysmon 提供的事件。
  • 0xFFFFFFFF 表示捕獲所有事件級別的資料。

使用 PowerShell 和 ETW:

你還可以使用 PowerShell 指令碼來啟動 ETW 跟蹤。例如,使用 New-EventTrace 命令來建立和啟動事件跟蹤會話。

5. PowerShell Performance Monitoring

Windows 還提供了內建的 PowerShell cmdlet 來進行效能監控和分析,類似於 dtrace

示例:監控 CPU 和記憶體使用情況

你可以使用 PowerShell 指令碼來定期收集 CPU 和記憶體使用情況,以下是一個簡單的指令碼:

powershellCopy Code
Get-Counter '\Processor(_Total)\% Processor Time'
Get-Counter '\Memory\Available MBytes'

示例:獲取程序資訊

powershellCopy Code
Get-Process

你可以結合 Get-EventLogGet-WinEvent 等命令,結合 ETW 提供的資訊進行更復雜的效能分析。

6. PerfView

PerfView 是由 Microsoft 提供的一個高階工具,用於分析 Windows 應用程式的效能資料。它利用 ETW 收集的事件資料,可以用來分析應用程式的 CPU 使用、垃圾回收、記憶體分配等。

示例:使用 PerfView 分析 CPU 使用情況

  1. 下載並啟動 PerfView
  2. 選擇 Collect -> Start Collection
  3. 執行你的程式,收集 CPU 使用情況。
  4. 停止收集並檢視分析結果。

7. Xperf (Windows Performance Toolkit的一部分)

Xperf 是 WPT 工具包的一部分,可以用來執行 ETW 事件收集,跟蹤 CPU 效能、記憶體使用、磁碟 I/O 等。你可以使用 Xperf 來生成高效的效能資料包告。

bashCopy Code
xperf -on latency -stackwalk profile -buffersize 1024 -maxbuffers 1024

解釋:

  • -on latency 啟動延遲分析。
  • -stackwalk profile 啟用堆疊跟蹤。
  • -buffersize 設定緩衝區大小,-maxbuffers 設定最大緩衝區數。

總結

儘管 Windows 不直接支援 dtrace,你可以使用以下工具來獲得類似的動態跟蹤和效能分析功能:

  • Windows Performance Toolkit (WPT),包括 WPR 和 WPA。
  • Process Monitor (ProcMon)
  • WinDbg
  • Event Tracing for Windows (ETW)
  • PowerShell 效能監控 cmdlet
  • PerfViewXperf

這些工具可以幫助你進行深入的效能分析和故障排查,適用於 Windows Server 系統。


透過以下幾個步驟來修正這些問題。

  1. 確認 PowerShell 中是否安裝了正確的模組:確保你的系統中安裝了用於事件追蹤的模組 Get-WinEvent 或類似的 ETW 模組。你可以執行以下命令來檢查:

    powershellCopy Code
    Get-Module -ListAvailable

    如果沒有找到相關模組,可以嘗試安裝 Microsoft.Diagnostics.EventFlow 等模組來支援 ETW 操作。

  2. 使用 New-EtwTraceSession 建立會話:你應該建立一個合適的 ETW 會話,並指定正確的提供者。例如,假設你想要監控記憶體相關的事件,可以透過指定提供者名稱來建立會話。嘗試以下程式碼:

    powershellCopy Code
    $session = New-EtwTraceSession -Name "MemoryMonitor" -ProviderId "Microsoft-Windows-Kernel-Memory"

    請注意,-Provider 應該換成提供者的識別符號(如 ProviderId),具體的 ID 值可以在 ETW 文件中查詢。

  3. 啟動會話並收集資料:確認 $session 已正確建立後,你可以啟動會話:

    powershellCopy Code
    Start-EtwTraceSession -Session $session
  4. 停止會話並獲取資料:資料收集完後,停止會話並檢視資料:

    powershellCopy Code
    Stop-EtwTraceSession -Session $session
  5. 檢視日誌:如果你想檢視收集到的記憶體監控日誌,可以使用 Get-WinEvent 或其他 ETW 相關的命令來分析日誌輸出。

    powershellCopy Code
    Get-WinEvent -LogName "Microsoft-Windows-Kernel-Memory"

示例指令碼:

powershellCopy Code
# 建立記憶體監控會話
$session = New-EtwTraceSession -Name "MemoryMonitor" -ProviderId "Microsoft-Windows-Kernel-Memory"

# 啟動會話
Start-EtwTraceSession -Session $session

# 等待一段時間,收集資料
Start-Sleep -Seconds 300  # 等待5分鐘

# 停止會話
Stop-EtwTraceSession -Session $session

# 檢視日誌
Get-WinEvent -LogName "Microsoft-Windows-Kernel-Memory"

總結:

  1. 請檢查你的 PowerShell 版本和模組,確保支援 ETW。
  2. 使用合適的引數(例如ProviderId),並確保 $session 變數包含有效的會話物件。
  3. 確認你執行每個步驟時 $session 變數的有效性,避免空值導致的錯誤。

在 Windows 環境下,使用 PowerShell 進行 ETW(事件跟蹤)和效能監控是非常強大的功能。PowerShell 提供了多種 cmdlet 來啟動、管理和分析 ETW 會話,進行效能監控,甚至可以透過指令碼自動化這些任務。

1. 使用 PowerShell 啟動 ETW 跟蹤

PowerShell 中沒有直接的 New-EventTrace cmdlet,但你可以使用 Get-WinEventNew-EventLogStart-EventTracing 等 cmdlet 來管理和分析 ETW 日誌。

啟動一個簡單的 ETW 跟蹤會話

可以透過使用 New-EventTrace 來啟動一個 ETW 跟蹤會話,或者使用 Start-EventTracing 啟動 ETW 會話進行事件跟蹤。以下是一個簡單的 ETW 跟蹤示例:

powershellCopy Code
# 啟動ETW會話並收集CPU相關的事件
$traceSession = New-EtwTraceSession -Name "CPUMonitoring" -Provider "Microsoft-Windows-Kernel-Processor-Power"

# 啟動事件追蹤
Start-EtwTraceSession -Session $traceSession

上面的指令碼使用了 Microsoft-Windows-Kernel-Processor-Power 提供程式來監視 CPU 相關的事件。

2. PowerShell 效能監控(Performance Monitoring)

Windows PowerShell 提供了多種內建 cmdlet 來幫助你進行系統效能監控。常用的 cmdlet 包括 Get-CounterGet-Process 等。

獲取效能計數器資料

Get-Counter cmdlet 用於獲取系統效能計數器資料,例如 CPU 使用率、記憶體使用情況、磁碟效能等。

powershellCopy Code
# 獲取 CPU 使用率
Get-Counter '\Processor(_Total)\% Processor Time'

# 獲取記憶體使用情況
Get-Counter '\Memory\Available MBytes'

# 獲取磁碟效能資料
Get-Counter '\LogicalDisk(_Total)\% Disk Time'

獲取 CPU、記憶體等程序資訊

你還可以使用 Get-Process 來獲取系統上所有程序的詳細資訊,包括 CPU 時間、記憶體使用情況等。

powershellCopy Code
# 獲取所有程序的 CPU 和記憶體使用情況
Get-Process | Select-Object Name, Id, CPU, WorkingSet

設定效能計數器的資料收集

你還可以使用 Get-Counter 來定期收集效能計數器資料,並將其儲存到一個檔案中進行後續分析。

powershellCopy Code
# 定期收集 CPU 使用率,並將結果輸出到 CSV 檔案
Get-Counter '\Processor(_Total)\% Processor Time' -Continuous -SampleInterval 1 | 
    Export-Csv "cpu_usage.csv" -NoTypeInformation

3. 使用 Get-WinEvent 進行 ETW 日誌分析

Get-WinEvent cmdlet 可以用來查詢和分析 ETW 日誌。它允許你查詢和過濾 Windows 事件日誌,包括從 ETW 會話收集到的日誌。

powershellCopy Code
# 查詢事件日誌,篩選出與 Kernel Provider 相關的事件
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" | 
    Format-Table -Property TimeCreated, Id, Message

示例:從 ETW 收集系統效能事件

你可以透過 Get-WinEvent 從 ETW 日誌中獲取系統效能資料,如 CPU 使用率、記憶體使用等。下面是一個查詢系統事件的示例。

powershellCopy Code
# 查詢系統事件,獲取系統效能日誌
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" | 
    Select-Object TimeCreated, Message | 
    Format-Table -AutoSize

4. 監控特定程序的效能

如果你對特定程序的效能感興趣,可以結合 Get-Process 和效能計數器來實時監控。

powershellCopy Code
# 監控特定程序(例如, notepad)的 CPU 和記憶體使用情況
$process = Get-Process -Name notepad
$process | Select-Object Name, Id, CPU, WorkingSet

持續監控程序效能

如果你希望每隔幾秒鐘監控一次程序的效能,您可以使用 -Continuous 引數來定期更新。

powershellCopy Code
# 每隔1秒獲取一次程序資訊,持續輸出
Get-Process -Name notepad | 
    Select-Object Name, Id, CPU, WorkingSet | 
    Format-Table -AutoSize
    Start-Sleep -Seconds 1

5. 效能資料儲存和分析

你可以將收集到的效能資料儲存到檔案中進行後續分析。例如,匯出 CPU 使用率資料到 CSV 檔案。

powershellCopy Code
# 將 CPU 使用率儲存到 CSV 檔案
Get-Counter '\Processor(_Total)\% Processor Time' -Continuous -SampleInterval 1 |
    Export-Csv "cpu_performance.csv" -NoTypeInformation

總結

PowerShell 提供了強大的功能來進行 ETW 跟蹤和效能監控,包括啟動 ETW 會話、獲取效能計數器資料、實時監控程序效能、分析日誌等。透過結合不同的 cmdlet,你可以建立自定義的效能監控指令碼,並進行深入分析。


深入探討 PowerShell 中的 ETW 跟蹤和效能監控,我們可以從以下幾個方向擴充套件:

6. 建立自定義 ETW 會話

在 PowerShell 中,你可以建立自定義的 ETW 跟蹤會話,以監控特定的應用程式或作業系統元件。這些會話可以透過 New-EtwTraceSession 來配置。

建立一個 ETW 跟蹤會話並啟用日誌:

powershellCopy Code
# 建立一個 ETW 跟蹤會話
$traceSession = New-EtwTraceSession -Name "MyCustomTraceSession" -Provider "Microsoft-Windows-Kernel-Processor-Power"

# 啟動事件追蹤會話
Start-EtwTraceSession -Session $traceSession

此示例啟動了一個跟蹤會話,監控與 CPU 相關的事件(使用 Microsoft-Windows-Kernel-Processor-Power 提供程式)。你可以替換 Provider 引數為其他應用程式或系統元件的提供程式名稱(例如,Microsoft-Windows-Diagnostics-PerformanceMicrosoft-Windows-Kernel-Base)。

自定義會話 - 選擇更多的提供程式

你可以在 New-EtwTraceSession 中選擇多個提供程式進行監控:

powershellCopy Code
# 建立一個跟蹤會話,監控 CPU 使用率、磁碟效能等
$traceSession = New-EtwTraceSession -Name "CustomSession" `
    -Provider "Microsoft-Windows-Kernel-Processor-Power" `
    -Provider "Microsoft-Windows-Disk-IO"

# 啟動會話
Start-EtwTraceSession -Session $traceSession

這個例子會同時收集 CPU 和磁碟 I/O 的 ETW 事件資料。

7. 實時檢視 ETW 日誌資料

PowerShell 提供了實時監控和檢視 ETW 跟蹤資料的方法。你可以使用 Get-WinEvent 來持續監控事件日誌的輸出,並進行實時分析。

實時監控 ETW 跟蹤輸出:

powershellCopy Code
# 監聽 ETW 提供程式的輸出
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" -MaxEvents 10 | Format-Table TimeCreated, Id, Message

如果你希望持續檢視並實時輸出資料,可以透過 -Wait 引數將 Get-WinEvent 命令轉換為實時監控模式:

powershellCopy Code
# 實時監控 ETW 提供程式輸出
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" -MaxEvents 1 -Wait |
    Format-Table TimeCreated, Id, Message

這樣,命令會不斷返回新的事件,直到你手動停止(透過 Ctrl+C)。

8. 效能計數器匯出和分析

如果你希望將效能計數器的資料儲存到檔案中並進行後續分析,可以將資料匯出為 CSV 或其他格式。這對於長時間跟蹤系統的效能資料非常有用。

匯出效能計數器到 CSV 檔案:

powershellCopy Code
# 匯出 CPU 使用率資料到 CSV 檔案
Get-Counter '\Processor(_Total)\% Processor Time' -Continuous -SampleInterval 5 |
    Export-Csv "cpu_usage_data.csv" -NoTypeInformation

這個命令會每 5 秒鐘取樣一次 CPU 使用率,並將結果儲存到 cpu_usage_data.csv 檔案中。可以使用 Excel 或其他工具進行資料分析。

監控多個計數器並匯出:

powershellCopy Code
# 同時監控多個效能計數器並匯出到 CSV 檔案
$counterList = @(
    '\Processor(_Total)\% Processor Time',
    '\Memory\Available MBytes',
    '\LogicalDisk(_Total)\% Disk Time'
)

Get-Counter $counterList -Continuous -SampleInterval 1 |
    Export-Csv "system_performance.csv" -NoTypeInformation

這個例子同時監控 CPU 使用率、可用記憶體和磁碟效能,並將資料儲存到 system_performance.csv 檔案中。

9. 分析 ETW 日誌

除了實時跟蹤和取樣資料,PowerShell 還可以幫助你分析從 ETW 跟蹤中收集到的日誌。

分析日誌檔案中的 ETW 事件:

powershellCopy Code
# 獲取 ETW 事件日誌,並篩選出某個具體事件
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" | 
    Where-Object {$_.Message -like "*Boot*" } | 
    Format-Table -Property TimeCreated, Message

這個命令從 "Diagnostics-Performance" 日誌中獲取所有與啟動過程相關的事件,並將結果顯示在表格中。

根據特定條件篩選日誌:

powershellCopy Code
# 根據時間和事件 ID 過濾 ETW 日誌
Get-WinEvent -LogName "System" |
    Where-Object { $_.TimeCreated -gt (Get-Date).AddMinutes(-30) -and $_.Id -eq 10016 } |
    Format-Table -Property TimeCreated, Id, Message

該命令查詢最近 30 分鐘內,事件 ID 為 10016 的日誌事件,並顯示事件的詳細資訊。

10. 建立效能監控報告

結合 PowerShell 中的 ETW 跟蹤、效能計數器和日誌分析功能,你可以建立自定義的效能監控報告,自動化並定期生成。

生成系統效能報告:

powershellCopy Code
# 獲取系統當前的 CPU 和記憶體使用情況
$cpuUsage = Get-Counter '\Processor(_Total)\% Processor Time'
$memoryUsage = Get-Counter '\Memory\Available MBytes'

# 獲取磁碟效能資料
$diskUsage = Get-Counter '\LogicalDisk(_Total)\% Disk Time'

# 生成報告
$report = [PSCustomObject]@{
    Time       = Get-Date
    CPUUsage   = $cpuUsage.CounterSamples[0].CookedValue
    MemoryUsage = $memoryUsage.CounterSamples[0].CookedValue
    DiskUsage  = $diskUsage.CounterSamples[0].CookedValue
}

# 輸出報告到檔案
$report | Export-Csv "performance_report.csv" -NoTypeInformation

這個指令碼每次執行時會獲取當前的 CPU 使用率、可用記憶體和磁碟效能資料,並生成一個 CSV 檔案報告。

11. 結合 ETW 和 PowerShell 定時任務

如果你需要定期收集 ETW 事件或效能計數器資料,可以將上述指令碼與 PowerShell 的定時任務 (Task Scheduler) 結合使用。你可以建立定時任務來定期執行這些效能監控指令碼,並將資料儲存到檔案中。

設定定時任務執行 PowerShell 指令碼:

powershellCopy Code
# 建立一個定時任務來每 10 分鐘執行一次效能監控指令碼
$scriptPath = "C:\path\to\performance_monitor.ps1"
$taskAction = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File $scriptPath"
$taskTrigger = New-ScheduledTaskTrigger -At (Get-Date).AddMinutes(10) -Daily
$taskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -Action $taskAction -Trigger $taskTrigger -Settings $taskSettings -TaskName "PerformanceMonitoring"

這段指令碼會建立一個定時任務,每 10 分鐘執行一次 performance_monitor.ps1 指令碼,進行效能資料採集。

總結

PowerShell 在 ETW 跟蹤和效能監控方面提供了靈活的支援,能夠幫助你從多種來源收集系統和應用程式效能資料,實時監控和分析日誌,並生成定期的效能報告。結合 PowerShell 的指令碼自動化能力,你可以方便地監控系統狀態,並根據需要調整監控目標、取樣頻率和資料儲存方式。


深入探討 PowerShell 中的 ETW 跟蹤和效能監控,以下是更多高階用法和技巧,可以幫助你更有效地利用 PowerShell 進行系統監控、效能最佳化和資料分析。

12. 高階 ETW 跟蹤:獲取特定事件和過濾日誌

除了基本的 ETW 跟蹤外,你還可以使用更復雜的篩選條件來捕獲特定的事件。這在診斷應用程式問題或對系統事件進行詳細分析時非常有用。

監聽特定事件並應用過濾器

powershellCopy Code
# 獲取與特定 Provider 相關的事件,並篩選出特定的 Message 內容
Get-WinEvent -ProviderName "Microsoft-Windows-Diagnostics-Performance" |
    Where-Object { $_.Message -match "Boot Time" } |
    Format-Table TimeCreated, Id, Message

這個命令從 Microsoft-Windows-Diagnostics-Performance 提供程式中篩選出所有包含 "Boot Time" 的事件,並顯示事件時間、ID 和訊息內容。

使用多條件篩選事件

你可以使用多個篩選條件來獲取更精確的日誌:

powershellCopy Code
# 獲取特定日誌並根據事件 ID 和訊息內容過濾
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" |
    Where-Object { $_.Id -eq 100 } |
    Where-Object { $_.Message -match "Error" } |
    Format-Table TimeCreated, Id, Message

這個例子從 "Diagnostics-Performance" 日誌中獲取所有事件 ID 為 100 的事件,並且訊息內容包含 "Error" 字串。

13. 結合 Performance Monitor 和 ETW

有時你需要同時使用效能計數器和 ETW 跟蹤來深入分析系統效能。在 PowerShell 中,你可以同時收集這兩種資料,並在報告中進行比較和分析。

實時收集 ETW 跟蹤和效能計數器資料

powershellCopy Code
# 定義需要收集的 ETW 提供程式和效能計數器
$etwProvider = "Microsoft-Windows-Kernel-Processor-Power"
$performanceCounters = @(
    '\Processor(_Total)\% Processor Time',
    '\Memory\Available MBytes',
    '\LogicalDisk(_Total)\% Disk Time'
)

# 啟動 ETW 跟蹤會話
$traceSession = New-EtwTraceSession -Name "PerformanceSession" -Provider $etwProvider
Start-EtwTraceSession -Session $traceSession

# 獲取效能計數器資料並顯示
$performanceData = Get-Counter $performanceCounters -Continuous -SampleInterval 5

# 顯示 ETW 和效能計數器資料
$performanceData.CounterSamples |
    Format-Table -Property Path, CookedValue

# 停止 ETW 跟蹤會話
Stop-EtwTraceSession -Session $traceSession

這段程式碼會同時啟動 ETW 跟蹤會話和效能計數器資料收集,輸出實時的系統效能資料。你可以根據需要選擇不同的 ETW 提供程式和效能計數器。

資料儲存和報告生成

你可以將從 ETW 跟蹤和效能計數器中收集的資料儲存到檔案中進行後續分析。例如,將這些資料儲存到 CSV 檔案中,以便在 Excel 中進行進一步分析:

powershellCopy Code
# 將效能計數器資料儲存到 CSV 檔案
$performanceData.CounterSamples |
    Select-Object Path, CookedValue |
    Export-Csv "performance_data.csv" -NoTypeInformation

# 匯出 ETW 跟蹤資料
$traceSession.Events |
    Export-Csv "etw_trace_data.csv" -NoTypeInformation

14. 自定義 ETW 提供程式的篩選條件

有時,預設的 ETW 跟蹤會產生大量的事件資料。為了提高資料收集的效率,可以透過自定義篩選條件來減少事件數量。這對於高頻率的事件(如網路請求、磁碟 I/O 等)尤其重要。

使用過濾條件建立自定義 ETW 會話

PowerShell 允許你透過提供篩選條件來啟動 ETW 跟蹤會話。你可以透過設定不同的過濾條件來捕獲特定的事件,減少不必要的資料收集。

powershellCopy Code
# 建立一個 ETW 跟蹤會話,並設定篩選條件來只監控特定事件
$filter = @{"EventId" = 100}  # 只捕獲事件 ID 為 100 的事件
$traceSession = New-EtwTraceSession -Name "FilteredTraceSession" -Provider "Microsoft-Windows-Diagnostics-Performance" -Filter $filter
Start-EtwTraceSession -Session $traceSession

在這個示例中,只有當事件的 ID 為 100 時,跟蹤會話才會捕獲事件資料。你可以根據需要自定義更復雜的篩選條件。

15. ETW 跟蹤會話的效能調優

當使用 ETW 跟蹤會話時,尤其是在高負載系統上,效能可能會受到影響。為了減少 ETW 跟蹤對系統效能的影響,可以採取以下措施:

減少跟蹤的資料量

透過僅選擇必要的事件和使用過濾器,可以顯著減少系統負載。例如,不要跟蹤所有事件,只跟蹤關心的部分:

powershellCopy Code
# 僅啟用與磁碟 I/O 相關的事件
$traceSession = New-EtwTraceSession -Name "DiskTraceSession" -Provider "Microsoft-Windows-Disk-IO"
Start-EtwTraceSession -Session $traceSession

使用非同步資料處理

為了減少對主執行緒的阻塞,可以將資料處理與 ETW 跟蹤分離,使用非同步處理。這樣,ETW 跟蹤會將事件資料傳輸到後臺進行分析,而不會影響主要任務的執行。

powershellCopy Code
# 使用後臺任務非同步處理 ETW 資料
$job = Start-Job -ScriptBlock {
    $traceSession = New-EtwTraceSession -Name "AsyncTraceSession" -Provider "Microsoft-Windows-Kernel-Processor-Power"
    Start-EtwTraceSession -Session $traceSession
    # 處理 ETW 資料的程式碼
}

# 等待任務完成並獲取結果
$job | Wait-Job
$job | Receive-Job

這種方式將 ETW 跟蹤和資料處理分離到後臺,從而避免影響主執行緒的效能。

16. ETW 日誌的歷史分析

如果你需要分析歷史日誌,可以從 Windows 日誌中提取過去的 ETW 事件,並進行長時間跨度的資料分析。Get-WinEvent 命令允許你按時間範圍、事件 ID、提供程式等進行篩選。

從歷史日誌中分析 ETW 事件

powershellCopy Code
# 獲取過去一小時內的所有系統日誌
$events = Get-WinEvent -LogName "System" -StartTime (Get-Date).AddHours(-1)

# 根據事件 ID 和訊息過濾資料
$filteredEvents = $events | Where-Object { $_.Id -eq 10016 }
$filteredEvents | Format-Table TimeCreated, Id, Message

此命令會獲取過去一小時內的系統事件日誌,並篩選出所有事件 ID 為 10016 的事件。你可以進一步分析這些事件,識別可能的問題。

17. 整合到自動化工作流中

PowerShell 強大的自動化功能使其在 ETW 跟蹤和效能監控方面的應用場景非常廣泛。你可以將 ETW 跟蹤任務整合到自動化工作流中,例如在系統啟動時自動收集效能資料,或者在系統出現特定問題時觸發跟蹤。

在系統啟動時自動啟動 ETW 跟蹤

powershellCopy Code
# 建立一個定時任務,在每次系統啟動時啟動 ETW 跟蹤
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command & {Start-EtwTraceSession -Name 'StartupTrace' -Provider 'Microsoft-Windows-Kernel-Processor-Power'}"
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "StartupETWTrace"

這個指令碼建立一個定時任務,在系統啟動時自動啟動 ETW 跟蹤會話。透過這種方式,你可以確保在系統啟動時捕獲重要的效能資料。

總結

PowerShell 提供了強大的 ETW 跟蹤和效能監控功能,允許你精確控制資料採集的範圍、頻率和儲存方式。透過結合 ETW 跟蹤、效能計數器、日誌分析以及自動化指令碼,你可以建立出一套完整的系統效能監控和分析框架,幫助你高效診斷和最佳化系統效能。


18. ETW 資料的高階分析和視覺化

在收集了大量 ETW 事件和效能資料之後,如何有效分析和視覺化這些資料就變得非常重要。PowerShell 本身有一些內建的命令和工具可以用來處理這些資料,但在一些複雜的情況下,可能還需要藉助外部工具,如 Excel、Power BI 或自定義指令碼來進行深入分析。

使用 PowerShell 對 ETW 資料進行簡單分析

你可以使用 PowerShell 的內建 cmdlet 對 ETW 資料進行一些基本的聚合分析,例如計算平均值、標準差、最大值和最小值等統計資料。

powershellCopy Code
# 從 ETW 跟蹤日誌中獲取特定的效能計數器資料
$etwData = Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" |
           Where-Object { $_.Message -match "Boot Time" }

# 提取特定的資料欄位,如 Boot Time
$bootTimes = $etwData | ForEach-Object {
    [int]($_.Message -replace '\D', '')  # 只提取數字部分並轉換為整數
}

# 計算基本的統計資訊
$averageBootTime = ($bootTimes | Measure-Object -Average).Average
$minBootTime = ($bootTimes | Measure-Object -Minimum).Minimum
$maxBootTime = ($bootTimes | Measure-Object -Maximum).Maximum

# 輸出統計結果
"Average Boot Time: $averageBootTime ms"
"Min Boot Time: $minBootTime ms"
"Max Boot Time: $maxBootTime ms"

在這個示例中,我們從 ETW 事件中提取了啟動時間資料,然後計算了啟動時間的平均值、最小值和最大值。這種簡單的統計方法可以幫助你瞭解效能資料的基本趨勢。

將 ETW 資料匯入 Power BI 進行視覺化

如果你需要更復雜的圖表和趨勢分析,Power BI 是一個強大的工具,可以將 ETW 資料匯入並進行視覺化。你可以先將資料匯出為 CSV 檔案,然後在 Power BI 中進行載入和分析。

powershellCopy Code
# 假設你已經將 ETW 資料匯出到 CSV 檔案
$etwData | Export-Csv "etw_performance_data.csv" -NoTypeInformation

# 然後你可以在 Power BI 中匯入該 CSV 檔案,建立圖表(例如時間序列圖、柱狀圖等)進行資料分析

Power BI 允許你建立動態報表和儀表板,以便在更大的資料集上進行互動式的分析,幫助你更容易地發現效能瓶頸和系統問題。

利用 Excel 進行資料分析

如果你更傾向於使用 Excel,PowerShell 同樣支援將 ETW 資料匯出為 CSV 格式,然後在 Excel 中建立各種圖表和資料透視表來進一步分析資料。

powershellCopy Code
# 匯出 ETW 資料為 CSV 檔案
$etwData | Export-Csv "etw_performance_data.csv" -NoTypeInformation

# 開啟 Excel 檔案後,你可以使用資料透視表來分析事件的分佈,或使用圖表(如柱狀圖、折線圖)來觀察效能資料的趨勢。

這種方式適用於中小規模的資料分析,並且 Excel 強大的功能讓你能夠靈活地處理、格式化和視覺化資料。

19. ETW 資料的匯出和存檔

在某些情況下,收集到的 ETW 跟蹤資料非常龐大,可能需要長期存檔和歸檔。你可以將這些資料匯出到檔案系統中,或者直接儲存到資料庫中,以便後續進行長期分析和查詢。

匯出 ETW 資料到資料庫

如果你需要更強大的查詢和存檔能力,可以將 ETW 資料匯入 SQL 資料庫。以下是將 ETW 資料匯出並儲存到 SQL Server 資料庫的示例:

powershellCopy Code
# 假設你已經從 ETW 獲取了一些事件資料
$etwData = Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational"

# 連線到 SQL Server
$connectionString = "Server=localhost;Database=ETWData;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()

# 定義 SQL 命令
$sqlCommand = $connection.CreateCommand()
$sqlCommand.CommandText = "INSERT INTO PerformanceLogs (EventId, Message, TimeCreated) VALUES (@EventId, @Message, @TimeCreated)"

# 使用引數化查詢插入資料
$etwData | ForEach-Object {
    $sqlCommand.Parameters.Clear()
    $sqlCommand.Parameters.Add((New-Object Data.SqlClient.SqlParameter("@EventId", [Data.SqlDbType]::Int))).Value = $_.Id
    $sqlCommand.Parameters.Add((New-Object Data.SqlClient.SqlParameter("@Message", [Data.SqlDbType]::NVarChar))).Value = $_.Message
    $sqlCommand.Parameters.Add((New-Object Data.SqlClient.SqlParameter("@TimeCreated", [Data.SqlDbType]::DateTime))).Value = $_.TimeCreated
    $sqlCommand.ExecuteNonQuery()
}

# 關閉資料庫連線
$connection.Close()

該指令碼將從 ETW 跟蹤中提取的資料逐條插入到 SQL Server 資料庫中,你可以隨時查詢、分析和存檔這些資料。透過 SQL 查詢,你能夠在更大的資料集上執行高效的資料聚合和篩選操作。

20. ETW 跟蹤的自動化與排程

你可以將 ETW 跟蹤任務自動化,以便定期收集效能資料。PowerShell 可以與 Windows 任務排程器配合使用,定期執行跟蹤指令碼並生成報告。

使用任務排程器定時啟動 ETW 跟蹤

powershellCopy Code
# 建立一個 PowerShell 指令碼,用於啟動 ETW 跟蹤會話
$scriptPath = "C:\Scripts\Start-ETWTrace.ps1"

# 建立一個任務,定時每隔 1 小時執行該指令碼
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File $scriptPath"
$trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"  # 每天凌晨2點執行一次
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "ETWTraceTask"

這個指令碼會建立一個定時任務,每天定時啟動 ETW 跟蹤,會自動收集系統效能資料,並根據需要生成報告。

21. ETW 與容器環境中的整合

在容器化的應用環境中,ETW 跟蹤和效能監控依然是非常重要的,特別是在使用 Docker 或 Kubernetes 等容器平臺時。PowerShell 可以幫助你在容器內執行 ETW 跟蹤,或者透過宿主機收集容器中的日誌和效能資料。

在容器內使用 ETW 跟蹤

對於在 Windows 容器中執行的應用,你可以使用 PowerShell 來啟動 ETW 跟蹤。以下是一個在 Windows 容器內啟動 ETW 跟蹤的例子:

powershellCopy Code
# 在容器內執行 ETW 跟蹤會話
docker exec -it <container_name> powershell -Command "Start-EtwTraceSession -Name 'ContainerETWTrace' -Provider 'Microsoft-Windows-Kernel-Processor-Power'"

你可以使用類似的方法將 ETW 跟蹤整合到容器環境中的監控體系,幫助你追蹤容器內的效能問題和事件。

總結

透過 PowerShell 和 ETW 跟蹤,您可以實現靈活、高效的系統效能監控、事件分析和自動化。無論是實時監控、歷史資料分析,還是整合到自動化工作流和容器環境中,PowerShell 都提供了豐富的功能和擴充套件性。您可以根據實際需求定製跟蹤和分析策略,幫助您在複雜的生產環境中診斷效能瓶頸,最佳化系統行為,保障系統的穩定性和高效性。


22. ETW 資料的深度分析和高階用例

在更復雜的場景中,ETW(事件跟蹤)可以與其他工具和技術結合,進行更深度的分析和調優。以下是一些高階應用場景,幫助你更好地利用 ETW 資料來進行系統效能最佳化、故障排查和應用分析。

22.1. 分析 CPU 效能瓶頸

透過 ETW,你可以捕捉到 CPU 使用情況的詳細資訊,幫助診斷效能瓶頸,特別是在高負載時。以下示例展示瞭如何使用 ETW 跟蹤 CPU 相關的事件。

捕捉 CPU 效能事件

你可以啟動一個 ETW 會話來捕獲 CPU 使用情況及執行緒資訊:

powershellCopy Code
# 啟動一個 ETW 跟蹤會話,監控 CPU 效能
$session = New-EtwTraceSession -Name "CPUMonitor" -Provider "Microsoft-Windows-Kernel-Processor-Power"

# 設定跟蹤範圍,例如 CPU 活動、執行緒上下文切換等
$session | Add-EtwProvider -Guid "{9A4F9203-D9B5-4D42-93D9-41B45EDE2B06}"

# 啟動跟蹤會話
Start-EtwTraceSession $session

# 捕獲資料一段時間後停止會話並處理資料
Stop-EtwTraceSession $session
分析結果

ETW 會跟蹤並記錄 CPU 效能事件(如上下文切換、CPU 佔用率等)。透過分析這些資料,你可以發現是否有某個執行緒或程序異常佔用 CPU,或者某些資源被高頻率切換。

22.2. 記憶體洩漏診斷

ETW 也支援捕獲與記憶體管理相關的事件,幫助診斷記憶體洩漏和記憶體過度使用的問題。

啟動記憶體監控

透過 Windows 效能提供者(例如 Microsoft-Windows-Kernel-Memory),你可以跟蹤記憶體使用情況:

powershellCopy Code
# 啟動記憶體使用監控
$session = New-EtwTraceSession -Name "MemoryMonitor" -Provider "Microsoft-Windows-Kernel-Memory"
Start-EtwTraceSession $session

# 等待幾分鐘後停止會話並收集資料
Stop-EtwTraceSession $session
分析記憶體資料

分析記憶體資料時,你可以檢視特定的記憶體使用事件(如記憶體分配和釋放),並透過 PowerShell 的分析功能來查詢潛在的記憶體洩漏。例如,你可能會發現某個模組在長時間執行後不斷分配記憶體而沒有釋放,導致記憶體佔用逐漸增加。

22.3. 診斷 I/O 效能問題

I/O 操作(磁碟、網路、檔案系統等)的效能問題是常見的瓶頸,ETW 同樣提供了豐富的 I/O 跟蹤資訊。你可以捕捉磁碟讀寫、網路請求和檔案系統操作等事件,幫助診斷效能瓶頸。

捕捉磁碟 I/O 資料
powershellCopy Code
# 啟動磁碟 I/O 跟蹤
$session = New-EtwTraceSession -Name "DiskIOMonitor" -Provider "Microsoft-Windows-Kernel-File"
Start-EtwTraceSession $session

# 在執行過程中分析磁碟讀寫事件
Stop-EtwTraceSession $session

透過分析磁碟 I/O 跟蹤資料,你可以瞭解哪些程序或執行緒導致了大量的磁碟讀寫操作,從而導致系統變慢。

22.4. 使用者空間應用程式的效能監控

ETW 也可以用來分析和監控使用者空間的應用程式,尤其是那些使用高頻率操作或有大量執行緒的程式。透過對應用程式的詳細事件進行跟蹤,能幫助你發現潛在的效能瓶頸和資源競爭。

捕捉應用程式事件

例如,想要監控某個應用的執行緒排程,可以使用 Microsoft-Windows-DotNETRuntime 提供程式,捕捉 .NET 應用程式的執行緒和垃圾回收事件:

powershellCopy Code
# 啟動 .NET 執行時事件跟蹤
$session = New-EtwTraceSession -Name "DotNetAppMonitor" -Provider "Microsoft-Windows-DotNETRuntime"
Start-EtwTraceSession $session

# 獲取應用程式中的垃圾回收、執行緒切換等資料
Stop-EtwTraceSession $session

透過捕捉這些資訊,你可以識別出垃圾回收頻率過高、執行緒阻塞等問題。

23. ETW 資料的自動化報告

透過 PowerShell 和 ETW 的結合,你可以實現 ETW 資料的定期自動化收集和報告生成。這對於定期監控和長期效能趨勢的分析非常有幫助。

23.1. 自動化資料收集

你可以設定一個自動化任務來定期收集 ETW 資料,生成報告併傳送郵件提醒。例如,透過任務排程器,定時執行 ETW 資料的收集指令碼:

powershellCopy Code
# 定義任務排程器的 PowerShell 指令碼
$scriptPath = "C:\Scripts\Collect-ETWData.ps1"

# 建立一個每天執行的任務
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File $scriptPath"
$trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"  # 每天凌晨2點收集資料
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "ETWDataCollection"

23.2. 生成報告併傳送郵件

你可以使用 PowerShell 自動化收集 ETW 資料後,生成分析報告並透過郵件傳送。例如,在收集完資料後,PowerShell 可以將報告匯出為 HTML 格式,並透過郵件傳送:

powershellCopy Code
# 假設 ETW 資料已經儲存到 CSV 檔案
$csvData = Import-Csv "C:\ETWData.csv"

# 生成 HTML 格式的報告
$report = $csvData | ConvertTo-Html -Property EventId, Message, TimeCreated -Head "ETW Report" -Body "Performance data collected"

# 儲存報告為 HTML 檔案
$report | Out-File "C:\Reports\ETWReport.html"

# 傳送郵件報告
$smtpServer = "smtp.example.com"
$smtpFrom = "sender@example.com"
$smtpTo = "recipient@example.com"
$mailSubject = "ETW Performance Report"
$mailBody = "Attached is the latest ETW performance report."
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$mail = New-Object Net.Mail.MailMessage($smtpFrom, $smtpTo, $mailSubject, $mailBody)
$mail.Attachments.Add("C:\Reports\ETWReport.html")
$smtp.Send($mail)

這種方法可以讓你定期獲得 ETW 資料分析報告,幫助你及時發現潛在的系統問題。

24. ETW 資料的實時監控和告警

ETW 也可以用於實時監控系統效能,並根據監控結果觸發告警。例如,你可以設定實時監控 CPU 使用率、記憶體佔用等效能指標,並在超出預設閾值時觸發告警。

24.1. 實時監控 CPU 使用率

powershellCopy Code
# 啟動 ETW 跟蹤監控 CPU 使用率
$session = New-EtwTraceSession -Name "CPUUsageMonitor" -Provider "Microsoft-Windows-Kernel-Processor-Power"
Start-EtwTraceSession $session

# 持續監控 CPU 使用率,並在使用率超過 90% 時傳送告警
while ($true) {
    $cpuUsage = Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" |
                Where-Object { $_.Message -match "CPU" }

    if ($cpuUsage -gt 90) {
        Send-MailMessage -From "monitor@example.com" -To "admin@example.com" -Subject "CPU Usage Alert" -Body "CPU usage exceeded 90%."
    }
    Start-Sleep -Seconds 60
}

透過此方法,您可以實時監控 CPU 或其他效能指標,並在達到預設的告警條件時自動通知管理員。

25. 總結

ETW 是 Windows 系統中非常強大的效能跟蹤工具,能夠提供詳細的系統和應用程式執行時資料。透過結合 PowerShell 的自動化功能,你可以靈活地收集、分析和存檔這些資料,甚至整合到更復雜的監控系統中。無論是透過 CSV、資料庫儲存、Power BI 還是郵件通知,ETW 資料都能幫助你在不同的場景中進行深度的效能最佳化和故障診斷。

隨著系統規模的增長,ETW 與 PowerShell 的結合將為你提供強大的資料處理和自動化能力,幫助你更好地瞭解系統的行為,並在問題發生之前進行預防性調優。


相關文章