You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Microsoft.Windows.EventTracing获取WPA中Total Commit-Process View的Size列

用Microsoft.Windows.EventTracing获取ETL中Total Commit(Process View)的Size值

前置准备

先给你的C#项目安装以下必要的NuGet包:

  • Microsoft.Windows.EventTracing.Processing
  • Microsoft.Windows.EventTracing.Memory
  • Microsoft.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}");
            }
        }
    }
}

关键逻辑说明

  1. 事件订阅:
    • UseMemoryCommitData() 获取WPA中Total Commit数据的核心来源——内存提交事件,每个事件包含单次提交的Size和所属进程ID。
    • UseProcesses() 获取进程元数据,用于将进程ID转换为易读的进程名称,和WPA视图的进程列对应。
  2. 数据聚合:通过字典按进程ID累加所有内存提交事件的Size,得到该进程的Total Commit Size,和WPA中Size列的统计逻辑一致。
  3. 结果输出:解析完成后关联进程名称,输出和WPA视图匹配的统计结果。

注意事项

  • 确保你的ETL文件是WPR捕获时包含了Memory相关的事件组,否则会无法获取内存提交数据。
  • 如果需要和WPA一致的单位(如MB),可以自行对输出的字节数做单位转换(1MB = 1024*1024字节)。

内容的提问来源于stack exchange,提问作者sreeR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:22:18