0

0

c# ETW事件和 EventSource 在性能分析中的作用

幻夢星雲

幻夢星雲

发布时间:2026-01-09 10:16:03

|

857人浏览过

|

来源于php中文网

原创

ETW是Windows内核级高性能事件追踪子系统,采用内核缓冲区、环形队列和延迟写入设计,EnableTrace启用后单次事件写入开销极低。

c# etw事件和 eventsource 在性能分析中的作用

ETW 是 Windows 上真正低开销的事件采集机制

ETW(Event Tracing for Windows)不是 .NET 专属,而是 Windows 内核级的高性能事件追踪子系统。它用内核缓冲区 + 环形队列 + 延迟写入设计,EnableTrace 开启后,单次事件写入通常仅需 Console.WriteLine 或日志库的毫秒级开销。关键在于:它不依赖托管堆分配、不触发 GC、不走 .NET 日志管道。

实际使用中,EventSource 类只是 ETW 的 .NET 封装层,它在运行时自动生成 ETW provider GUID,并把 WriteEvent 调用翻译为 EventWriteTransfer 等原生 ETW API。这意味着你写的 EventSource 代码,最终跑的是 Windows 原生事件路径。

常见误区是认为“加了 [EventSource(Name = "MyApp")] 就自动高性能”——其实不然。如果在事件方法里做了字符串拼接、对象序列化、或调用了 ToString(),这些操作仍在用户态执行,会显著拖慢吞吐。性能收益只在“事件写入”环节,前置计算仍由你负责。

EventSource.WriteEvent 的参数传递必须是原始类型或结构体

EventSource 不支持任意对象序列化。它只接受 intstringGuidDateTimelong、枚举、以及标记 [EventData] 的简单 struct。传入 class 实例、Dictionary 或匿名类型会直接抛出 ArgumentException:“The event field type is not supported.”

典型错误写法:

public void LogRequest(HttpRequest req) {
    WriteEvent(1, req.Path, req.Method); // ❌ req.Path 可能是 null 或复杂属性链
}

正确做法是提前提取值,且避免空引用:

  • req?.Path ?? "(null)" 替代 req.Path
  • 不要传 req.Headers,而应传 req.Headers.Count 或预提取关键 header 值
  • 若需结构化数据,定义轻量 struct 并用 [NonEvent] 方法做转换

用 PerfView 捕获 EventSource 事件时要注意 Provider 名称匹配

PerfView 默认只收集已知 provider(如 Microsoft-Windows-DotNETRuntime),你自定义的 EventSource 必须显式启用。Provider 名称默认是类名全限定名,但可通过构造函数覆盖:

public sealed class MyEventSource : EventSource
{
    public static MyEventSource Log = new MyEventSource();
    private MyEventSource() : base("MyCompany-MyApp") { } // ✅ 显式指定名称
}

启动 PerfView 时,必须在 “Collect → Additional Providers” 中填入:MyCompany-MyApp:0x10000:5(其中 0x10000 是 Level=Verbose,5 是 Keyword=All)。漏掉冒号或关键字位会导致事件完全不出现。

杰易OA办公自动化系统6.0
杰易OA办公自动化系统6.0

基于Intranet/Internet 的Web下的办公自动化系统,采用了当今最先进的PHP技术,是综合大量用户的需求,经过充分的用户论证的基础上开发出来的,独特的即时信息、短信、电子邮件系统、完善的工作流、数据库安全备份等功能使得信息在企业内部传递效率极大提高,信息传递过程中耗费降到最低。办公人员得以从繁杂的日常办公事务处理中解放出来,参与更多的富于思考性和创造性的工作。系统力求突出体系结构简明

下载

另一个常见问题:程序启动后才打开 PerfView,会错过初始化阶段的事件(如 EventSource 自身的 ManifestData 事件)。建议先在 PerfView 中点击 “Collect”,再启动目标进程。

高频率场景下必须用 EventSourceMessageAttribute 控制字段裁剪

当每秒写入数千次事件时,即使参数是原始类型,字符串字段仍可能成为瓶颈。ETW 对每个事件的大小有限制(默认约 64KB),但更现实的瓶颈是内存拷贝和内核缓冲区竞争。

[EventSourceMessage] 不是装饰用的——它让编译器在生成 manifest 时把字段标记为可选(eventFieldAttr="Optional"),配合 PerfView 的 “Filter Events” 或 TraceEvent 库的 Filter,可在采集时跳过未启用的字段,减少序列化开销。

例如:

[Event(1, Level = EventLevel.Informational)]
public void RequestStarted(
    string path,
    [EventSourceMessage] string userAgent, // ✅ 可被过滤掉
    int statusCode)
{
    WriteEvent(1, path, userAgent, statusCode);
}

这样在低开销采集中,可只保留 pathstatusCode,彻底跳过 userAgent 字符串的复制与写入。

真正容易被忽略的是:这种裁剪只在 ETW 层生效;如果你用 EventListener 在进程内监听,所有字段仍会传入,裁剪无效。所以生产环境高频打点,务必搭配外部工具(PerfView / Windows Performance Recorder)采集,而非依赖进程内监听。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

565

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1085

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

776

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2345

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

773

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1485

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

1613

2023.08.30

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.9万人学习

Excel 教程
Excel 教程

共162课时 | 11.2万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号