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
允許與其他工具和系統進行整合,增強其功能和適用範圍。
- 與效能分析工具整合:可以與
perf
、vmstat
、iotop
等工具配合使用,提供更全面的系統效能分析。 - 與日誌系統整合:將追蹤結果整合到日誌管理系統中,進行更長時間的歷史資料分析。
- 支援多種作業系統:
dtrace
不僅支援 Solaris,還支援 macOS 和部分 Linux 發行版,具有較強的跨平臺能力。
總結:
dtrace
的功能可以大致分為以下幾類:
- 系統效能分析:CPU、記憶體、I/O 等資源的效能分析。
- 動態事件追蹤:監控和捕捉系統事件,幫助進行效能調優和故障排查。
- 故障診斷與除錯:定位系統和應用程式中的問題,進行深度除錯。
- 核心級追蹤:對作業系統核心的深入分析和除錯。
- 使用者空間追蹤:對執行中的應用程式進行詳細的監控。
- 安全性和審計:用於安全監控、異常檢測和訪問控制審計。
- 自定義指令碼支援:透過編寫 D 指令碼實現自定義事件捕獲與分析。
- 可擴充套件性和整合:支援與其他工具的整合,增強功能。
這些功能使得 dtrace
成為一個非常強大且靈活的工具,廣泛用於效能調優、故障排查、系統監控等多個領域。
dtrace -V |
Copy Code
引數說明:
總結:
|
dtrace [-P provider [[ predicate ] action ]] predicate -> '/' D-expression '/' -b set trace buffer size |
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)。你可以用這些工具來捕獲和分析系統事件和效能瓶頸。
示例:記錄系統效能事件
- 啟動 Windows Performance Recorder(WPR)。
- 選擇 CPU Usage、Disk IO、Memory Usage 等跟蹤選項。
- 點選 Start,然後執行你想要分析的操作。
- 點選 Stop 完成效能取樣,結果會生成一個
.etl
檔案。 - 使用 Windows Performance Analyzer (WPA) 開啟
.etl
檔案進行分析。
2. Process Monitor (ProcMon)
Process Monitor 是另一個非常強大的 Windows 工具,可以用來監控檔案系統、登錄檔、程序、執行緒等事件。它類似於 dtrace
的一種資料捕獲和事件監控工具。
示例:捕獲檔案操作和登錄檔訪問
- 啟動 Process Monitor。
- 配置過濾器,僅捕獲你感興趣的事件(如檔案系統操作、登錄檔訪問等)。
- 開始捕獲資料並執行你需要分析的操作。
- 停止捕獲並分析日誌。
3. Windows Debugging Tools (WinDbg)
WinDbg 是一個高階除錯工具,適用於 Windows 應用程式、核心、驅動程式等。你可以用它來進行低階別的故障排查、堆疊跟蹤和記憶體分析。
示例:使用 WinDbg 捕獲堆疊資訊
- 啟動 WinDbg,並連線到目標系統。
- 使用
!analyze -v
命令來分析崩潰轉儲檔案,或者使用!process
命令檢視程序資訊。 - 除錯核心或應用程式崩潰、效能瓶頸等。
4. ETW (Event Tracing for Windows)
ETW 是 Windows 提供的一個高效的事件跟蹤機制,允許你捕獲系統級別的事件,類似於 dtrace
提供的功能。透過 ETW,你可以收集關於系統、應用程式、硬體的詳細資訊,並進行效能分析。
示例:使用 ETW 跟蹤系統呼叫
你可以透過 logman
或 xperf
等工具來捕獲 ETW 事件。
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 和記憶體使用情況,以下是一個簡單的指令碼:
Get-Counter '\Processor(_Total)\% Processor Time'
Get-Counter '\Memory\Available MBytes'
示例:獲取程序資訊
Get-Process
你可以結合 Get-EventLog
或 Get-WinEvent
等命令,結合 ETW 提供的資訊進行更復雜的效能分析。
6. PerfView
PerfView 是由 Microsoft 提供的一個高階工具,用於分析 Windows 應用程式的效能資料。它利用 ETW 收集的事件資料,可以用來分析應用程式的 CPU 使用、垃圾回收、記憶體分配等。
示例:使用 PerfView 分析 CPU 使用情況
- 下載並啟動 PerfView。
- 選擇 Collect -> Start Collection。
- 執行你的程式,收集 CPU 使用情況。
- 停止收集並檢視分析結果。
7. Xperf (Windows Performance Toolkit的一部分)
Xperf 是 WPT 工具包的一部分,可以用來執行 ETW 事件收集,跟蹤 CPU 效能、記憶體使用、磁碟 I/O 等。你可以使用 Xperf 來生成高效的效能資料包告。
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。
- PerfView 和 Xperf。
這些工具可以幫助你進行深入的效能分析和故障排查,適用於 Windows Server 系統。
透過以下幾個步驟來修正這些問題。
-
確認 PowerShell 中是否安裝了正確的模組:確保你的系統中安裝了用於事件追蹤的模組
Get-WinEvent
或類似的 ETW 模組。你可以執行以下命令來檢查:powershellCopy CodeGet-Module -ListAvailable
如果沒有找到相關模組,可以嘗試安裝
Microsoft.Diagnostics.EventFlow
等模組來支援 ETW 操作。 -
使用
New-EtwTraceSession
建立會話:你應該建立一個合適的 ETW 會話,並指定正確的提供者。例如,假設你想要監控記憶體相關的事件,可以透過指定提供者名稱來建立會話。嘗試以下程式碼:powershellCopy Code$session = New-EtwTraceSession -Name "MemoryMonitor" -ProviderId "Microsoft-Windows-Kernel-Memory"
請注意,
-Provider
應該換成提供者的識別符號(如ProviderId
),具體的 ID 值可以在 ETW 文件中查詢。 -
啟動會話並收集資料:確認
$session
已正確建立後,你可以啟動會話:powershellCopy CodeStart-EtwTraceSession -Session $session
-
停止會話並獲取資料:資料收集完後,停止會話並檢視資料:
powershellCopy CodeStop-EtwTraceSession -Session $session
-
檢視日誌:如果你想檢視收集到的記憶體監控日誌,可以使用
Get-WinEvent
或其他 ETW 相關的命令來分析日誌輸出。powershellCopy CodeGet-WinEvent -LogName "Microsoft-Windows-Kernel-Memory"
示例指令碼:
# 建立記憶體監控會話
$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"
總結:
- 請檢查你的 PowerShell 版本和模組,確保支援 ETW。
- 使用合適的引數(例如
ProviderId
),並確保$session
變數包含有效的會話物件。 - 確認你執行每個步驟時
$session
變數的有效性,避免空值導致的錯誤。
在 Windows 環境下,使用 PowerShell 進行 ETW(事件跟蹤)和效能監控是非常強大的功能。PowerShell 提供了多種 cmdlet 來啟動、管理和分析 ETW 會話,進行效能監控,甚至可以透過指令碼自動化這些任務。
1. 使用 PowerShell 啟動 ETW 跟蹤
PowerShell 中沒有直接的 New-EventTrace
cmdlet,但你可以使用 Get-WinEvent
、New-EventLog
和 Start-EventTracing
等 cmdlet 來管理和分析 ETW 日誌。
啟動一個簡單的 ETW 跟蹤會話
可以透過使用 New-EventTrace
來啟動一個 ETW 跟蹤會話,或者使用 Start-EventTracing
啟動 ETW 會話進行事件跟蹤。以下是一個簡單的 ETW 跟蹤示例:
# 啟動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-Counter
和 Get-Process
等。
獲取效能計數器資料
Get-Counter
cmdlet 用於獲取系統效能計數器資料,例如 CPU 使用率、記憶體使用情況、磁碟效能等。
# 獲取 CPU 使用率
Get-Counter '\Processor(_Total)\% Processor Time'
# 獲取記憶體使用情況
Get-Counter '\Memory\Available MBytes'
# 獲取磁碟效能資料
Get-Counter '\LogicalDisk(_Total)\% Disk Time'
獲取 CPU、記憶體等程序資訊
你還可以使用 Get-Process
來獲取系統上所有程序的詳細資訊,包括 CPU 時間、記憶體使用情況等。
# 獲取所有程序的 CPU 和記憶體使用情況
Get-Process | Select-Object Name, Id, CPU, WorkingSet
設定效能計數器的資料收集
你還可以使用 Get-Counter
來定期收集效能計數器資料,並將其儲存到一個檔案中進行後續分析。
# 定期收集 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 會話收集到的日誌。
# 查詢事件日誌,篩選出與 Kernel Provider 相關的事件
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" |
Format-Table -Property TimeCreated, Id, Message
示例:從 ETW 收集系統效能事件
你可以透過 Get-WinEvent
從 ETW 日誌中獲取系統效能資料,如 CPU 使用率、記憶體使用等。下面是一個查詢系統事件的示例。
# 查詢系統事件,獲取系統效能日誌
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" |
Select-Object TimeCreated, Message |
Format-Table -AutoSize
4. 監控特定程序的效能
如果你對特定程序的效能感興趣,可以結合 Get-Process
和效能計數器來實時監控。
# 監控特定程序(例如, notepad)的 CPU 和記憶體使用情況
$process = Get-Process -Name notepad
$process | Select-Object Name, Id, CPU, WorkingSet
持續監控程序效能
如果你希望每隔幾秒鐘監控一次程序的效能,您可以使用 -Continuous
引數來定期更新。
# 每隔1秒獲取一次程序資訊,持續輸出
Get-Process -Name notepad |
Select-Object Name, Id, CPU, WorkingSet |
Format-Table -AutoSize
Start-Sleep -Seconds 1
5. 效能資料儲存和分析
你可以將收集到的效能資料儲存到檔案中進行後續分析。例如,匯出 CPU 使用率資料到 CSV 檔案。
# 將 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 跟蹤會話並啟用日誌:
# 建立一個 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-Performance
或 Microsoft-Windows-Kernel-Base
)。
自定義會話 - 選擇更多的提供程式
你可以在 New-EtwTraceSession
中選擇多個提供程式進行監控:
# 建立一個跟蹤會話,監控 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 跟蹤輸出:
# 監聽 ETW 提供程式的輸出
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" -MaxEvents 10 | Format-Table TimeCreated, Id, Message
如果你希望持續檢視並實時輸出資料,可以透過 -Wait
引數將 Get-WinEvent
命令轉換為實時監控模式:
# 實時監控 ETW 提供程式輸出
Get-WinEvent -ProviderName "Microsoft-Windows-Kernel-Processor-Power" -MaxEvents 1 -Wait |
Format-Table TimeCreated, Id, Message
這樣,命令會不斷返回新的事件,直到你手動停止(透過 Ctrl+C)。
8. 效能計數器匯出和分析
如果你希望將效能計數器的資料儲存到檔案中並進行後續分析,可以將資料匯出為 CSV 或其他格式。這對於長時間跟蹤系統的效能資料非常有用。
匯出效能計數器到 CSV 檔案:
# 匯出 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 或其他工具進行資料分析。
監控多個計數器並匯出:
# 同時監控多個效能計數器並匯出到 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 事件:
# 獲取 ETW 事件日誌,並篩選出某個具體事件
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" |
Where-Object {$_.Message -like "*Boot*" } |
Format-Table -Property TimeCreated, Message
這個命令從 "Diagnostics-Performance" 日誌中獲取所有與啟動過程相關的事件,並將結果顯示在表格中。
根據特定條件篩選日誌:
# 根據時間和事件 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 跟蹤、效能計數器和日誌分析功能,你可以建立自定義的效能監控報告,自動化並定期生成。
生成系統效能報告:
# 獲取系統當前的 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 指令碼:
# 建立一個定時任務來每 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 跟蹤外,你還可以使用更復雜的篩選條件來捕獲特定的事件。這在診斷應用程式問題或對系統事件進行詳細分析時非常有用。
監聽特定事件並應用過濾器
# 獲取與特定 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 和訊息內容。
使用多條件篩選事件
你可以使用多個篩選條件來獲取更精確的日誌:
# 獲取特定日誌並根據事件 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 跟蹤和效能計數器資料
# 定義需要收集的 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 中進行進一步分析:
# 將效能計數器資料儲存到 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 跟蹤會話。你可以透過設定不同的過濾條件來捕獲特定的事件,減少不必要的資料收集。
# 建立一個 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 跟蹤對系統效能的影響,可以採取以下措施:
減少跟蹤的資料量
透過僅選擇必要的事件和使用過濾器,可以顯著減少系統負載。例如,不要跟蹤所有事件,只跟蹤關心的部分:
# 僅啟用與磁碟 I/O 相關的事件
$traceSession = New-EtwTraceSession -Name "DiskTraceSession" -Provider "Microsoft-Windows-Disk-IO"
Start-EtwTraceSession -Session $traceSession
使用非同步資料處理
為了減少對主執行緒的阻塞,可以將資料處理與 ETW 跟蹤分離,使用非同步處理。這樣,ETW 跟蹤會將事件資料傳輸到後臺進行分析,而不會影響主要任務的執行。
# 使用後臺任務非同步處理 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 事件
# 獲取過去一小時內的所有系統日誌
$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 跟蹤
# 建立一個定時任務,在每次系統啟動時啟動 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 資料進行一些基本的聚合分析,例如計算平均值、標準差、最大值和最小值等統計資料。
# 從 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 中進行載入和分析。
# 假設你已經將 ETW 資料匯出到 CSV 檔案
$etwData | Export-Csv "etw_performance_data.csv" -NoTypeInformation
# 然後你可以在 Power BI 中匯入該 CSV 檔案,建立圖表(例如時間序列圖、柱狀圖等)進行資料分析
Power BI 允許你建立動態報表和儀表板,以便在更大的資料集上進行互動式的分析,幫助你更容易地發現效能瓶頸和系統問題。
利用 Excel 進行資料分析
如果你更傾向於使用 Excel,PowerShell 同樣支援將 ETW 資料匯出為 CSV 格式,然後在 Excel 中建立各種圖表和資料透視表來進一步分析資料。
# 匯出 ETW 資料為 CSV 檔案
$etwData | Export-Csv "etw_performance_data.csv" -NoTypeInformation
# 開啟 Excel 檔案後,你可以使用資料透視表來分析事件的分佈,或使用圖表(如柱狀圖、折線圖)來觀察效能資料的趨勢。
這種方式適用於中小規模的資料分析,並且 Excel 強大的功能讓你能夠靈活地處理、格式化和視覺化資料。
19. ETW 資料的匯出和存檔
在某些情況下,收集到的 ETW 跟蹤資料非常龐大,可能需要長期存檔和歸檔。你可以將這些資料匯出到檔案系統中,或者直接儲存到資料庫中,以便後續進行長期分析和查詢。
匯出 ETW 資料到資料庫
如果你需要更強大的查詢和存檔能力,可以將 ETW 資料匯入 SQL 資料庫。以下是將 ETW 資料匯出並儲存到 SQL Server 資料庫的示例:
# 假設你已經從 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 跟蹤
# 建立一個 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 跟蹤的例子:
# 在容器內執行 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 使用情況及執行緒資訊:
# 啟動一個 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
),你可以跟蹤記憶體使用情況:
# 啟動記憶體使用監控
$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 資料
# 啟動磁碟 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 應用程式的執行緒和垃圾回收事件:
# 啟動 .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 資料的收集指令碼:
# 定義任務排程器的 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 格式,並透過郵件傳送:
# 假設 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 使用率
# 啟動 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 的結合將為你提供強大的資料處理和自動化能力,幫助你更好地瞭解系統的行為,並在問題發生之前進行預防性調優。