gpt4 book ai didi

c++ - 将 ETW 文件对象与 DiskIO 事件相关联

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:45 24 4
gpt4 key购买 nike

我正在尝试了解如何使 ETW 跟踪可靠地工作。我遇到的问题是我没有始终如一地收到我需要的 FileIo 中断或名称事件,以便在驱动程序级别将文件名与 DiskIo 事件相关联。我正在使用实时事件跟踪。我研究了 session 结束时从 ETW 返回的统计数据,我似乎没有丢弃事件(EventsLost 和 RealTimeBuffersLost 始终为零)。在某些情况下,我会收到 FileName/FileRundown 事件,而在其他情况下则不会。

我在此线程中找到了一些有用的信息:How to determine the file name involved in an IO operation using windows etw tracing? .我在那里找到了一些指向 ProcessHacker ( http://processhacker.sourceforge.net/doc/etwmon_8c_source.html ) 源代码的链接。通过研究 ProcessHacker 代码,我发现了一些与我设置事件跟踪的方式不同的地方。我想知道这些差异是否导致了我的问题?

首先,ProcessHacker 设置了两个跟踪 session 。一个接收大量所需的 ETW 事件(FileIo、DiskIo、NetworkIo)。另一个只查找 FileRundown 事件。在我的应用程序中,我使用一个跟踪 session 来捕获所有内容。我注意到关于用于中断 session 的 EVENT_TRACE_PROPERTIES 的一件有趣的事情是它没有指定任何 EnableFlags。 “主” session 使用我期望的标志(DISK_IO、FILE_IO、NETWORK_TCPIP)。

其次,ProcessHacker 使用更新的“EventRecord”回调而不是旧的“EventTrace”回调。我的应用程序使用“旧”EventTrace 回调。此选择是通过在 EVENT_TRACE_LOGFILE 结构中指定 PROCESS_TRACE_MODE_EVENT_RECORD 进行的。

这些差异是否会导致我所看到的行为?

最佳答案

我回答了我自己的问题。关键是我指出的第一个区别。我在两个线程之间拆分事件处理任务,而不是尝试在单个线程中处理所有事情。因此,现在我将 FileIo、DiskIo 和 Image 事件指向一个线程,将 FileCreate、FileRundown 和 FileName 事件指向另一个线程。这解决了问题。

这表明我正在沿链的某个位置删除 ETW 事件。然而,ETW session 统计数据并未报告这一事实(EventsLost RealTimeEventsLost 和 BuffersLost 均为零)。

我想这应该是显而易见的,但在尝试处理大量(数百万)ETW 事件时,性能至关重要。就我而言,我正在监听驱动程序级别的事件(DriverCall、DriverComplete 等)。这增加了事件的数量,似乎加剧了我所看到的问题。

在解决这个问题之前,我进行了一些简单的实验。在实验中,我禁用了驱动程序级别的事件。在这种情况下,单线程事件处理器能够跟上 DiskIo 事件和 FileName 事件。一旦我重新打开驱动程序事件,我就会回到无法可靠地接收 FileName 事件的状态。

关于c++ - 将 ETW 文件对象与 DiskIO 事件相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com