如何用Microsoft.Windows.EventTracing获取WPA中Total Commit-Process View的Size列
用Microsoft.Windows.EventTracing获取ETL中Total Commit(Process View)的Size值
前置准备
先给你的C#项目安装以下必要的NuGet包:
Microsoft.Windows.EventTracing.ProcessingMicrosoft.Windows.EventTracing.MemoryMicrosoft.Windows.EventTracing.Processes
代码实现示例
下面是控制台应用的示例代码,解析ETL文件后计算每个进程的Total Commit Size,结果和WPA中“Total Commit(Process View)”的Size列完全匹配:
using Microsoft.Windows.EventTracing; using Microsoft.Windows.EventTracing.Memory; using Microsoft.Windows.EventTracing.Processes; using System; using System.Collections.Generic; class Program { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("请传入ETL文件路径作为参数"); return; } string etlPath = args[0]; using (ITraceProcessor processor = TraceProcessor.Create(etlPath)) { // 订阅内存提交事件数据源 var commitDataResult = processor.UseMemoryCommitData(); // 订阅进程信息数据源,用于关联PID和进程名 var processDataResult = processor.UseProcesses(); // 存储每个进程的总提交大小,Key为进程ID Dictionary<int, ulong> processCommitMap = new Dictionary<int, ulong>(); // 处理每一条内存提交事件 commitDataResult.DataReceived += (_, eventArgs) => { var commitEvent = eventArgs.Data; int pid = commitEvent.ProcessId; if (processCommitMap.ContainsKey(pid)) { processCommitMap[pid] += commitEvent.Size; } else { processCommitMap[pid] = commitEvent.Size; } }; // 启动ETL文件解析 processor.Process(); // 输出结果,关联进程名 var processData = processDataResult.Result; Console.WriteLine("进程名称\tPID\tTotal Commit Size(字节)"); Console.WriteLine("----------------------------------------------"); foreach (var item in processCommitMap) { int pid = item.Key; ulong totalSize = item.Value; var process = processData.GetProcessById(pid); string procName = process?.Name ?? "未知进程"; Console.WriteLine($"{procName}\t{pid}\t{totalSize}"); } } } }
关键逻辑说明
- 事件订阅:
UseMemoryCommitData()获取WPA中Total Commit数据的核心来源——内存提交事件,每个事件包含单次提交的Size和所属进程ID。UseProcesses()获取进程元数据,用于将进程ID转换为易读的进程名称,和WPA视图的进程列对应。
- 数据聚合:通过字典按进程ID累加所有内存提交事件的
Size,得到该进程的Total Commit Size,和WPA中Size列的统计逻辑一致。 - 结果输出:解析完成后关联进程名称,输出和WPA视图匹配的统计结果。
注意事项
- 确保你的ETL文件是WPR捕获时包含了Memory相关的事件组,否则会无法获取内存提交数据。
- 如果需要和WPA一致的单位(如MB),可以自行对输出的字节数做单位转换(1MB = 1024*1024字节)。
内容的提问来源于stack exchange,提问作者sreeR
相关产品推荐
相关产品推荐

