【发布时间】:2019-06-10 18:27:23
【问题描述】:
为什么我记录到内存缓冲区中却总是丢失事件?
这对我来说毫无意义。没有缓冲区被丢弃但单个事件怎么会发生?我已将问题追溯到 CLR Rundown 会话,该会话总是丢失一些事件。问题似乎是我有大量托管进程(大约 60 个),它们都试图同时将它们的事件发送到 ETW。
我可以用
重现这个C>xperf -start ClrRundown -on "Microsoft-Windows-DotNETRuntime":0x118:5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:5 -buffersize 512 -minbuffers 512 -maxbuffers 1024 -Buffering
C>xperf -Loggers ClrRundown
Logger Name : ClrRundown
Logger Id : 1e
Logger Thread Id : 0000000000000000
Buffer Size : 512
Maximum Buffers : 512
Minimum Buffers : 512
Number of Buffers : 512
Free Buffers : 504
Buffers Written : 0
Events Lost : **29**
Log Buffers Lost : 0
Real Time Buffers Lost: 0
Flush Timer : 0
Age Limit : 0
Log File Mode : Buffered StopOnHybridShutdown IndependentSession
Maximum File Size : 0
Log Filename :
Trace Flags : ".NET Common Language Runtime":0x118:0x5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:0x5
我不关心少数丢失的事件,但在打开此类跟踪时,我总是会收到 WPA 的警告。这让 WPA 的非普通用户感到困惑,他们害怕自己做错了什么,并阻止加载跟踪文件。 有没有办法防止丢失事件?我发现的唯一另一个标志是来自 xperf 的 -NoPerProcessorBuffering 也没有帮助。将缓冲区大小增加到 8MB 也没有改变任何东西。
如果没有丢失事件就无法记录数据,是否有廉价且快速的方法来重置生成的未合并 ETL 文件的丢失事件计数?
【问题讨论】:
标签: etw