Windows Xperf diskio操作不会向我显示程序在性能跟踪会话期间读取的文件

我运行xperf以便在运行时获取程序的跟踪信息。该程序读取一个文件。它是用F#编写的.NET程序,文件在这里阅读:
System.IO.File.ReadAllLines("MyReadFile.txt")
好。我运行xperf:
xperf -on DiagEasy
我停止xperf并合并到一个文件中:
xperf -d myfile.etl
好。 现在我写道:
xperf -i myfile.etl -o myfile_stat.txt -a diskio -detail
我这样做,所以我可以获得一个文件的所有信息。显示的文件是一个格式化的文本文件,以便让我按文件查看磁盘统计信息。在跟踪会话期间操作的每个文件都显示有关于读取/写入文件的过程的大量数据,等等...... 但是
MyReadFile.txt
并没有出现在那里。 为什么????? 是因为cpu采样频率太低了?我该怎么改变它?... 但是,我的程序读取文件,我敢肯定,程序启动并打印出内容...... 谢谢     
已邀请:
文件I / O监控不基于采样。相反,相关的ETW提供程序会为每个受监视的I / O引发事件。它不应该错过任何东西。 如果这是我的代码,我怀疑它没有真正读取该文件。或许ERROR_FILE_NOT_FOUND? 此外,该标志应该是DiagEasy,而不是EasyDiag。 FWIW,这是我如何进行文件监控,启用堆栈跟踪: xperf -on PROC_THREAD + LOADER + FILE_IO + FILE_IO_INIT + FILENAME -stackwalk FileCreate + FileRead + FileWrite + FileFlush + FileQueryInformation + FileSetinformation + FileDelete 问候, 加里     
DiagEasy为磁盘启用IO的ETW检测。如果文件已经在内存中,那么就没有IO。您需要打开上面Gary所描述的FILE_IO和FILE_IO_INIT事件来捕获所有文件访问,甚至是当前在内存中的文件。 您可能会问为什么文件在内存中。收集数据时,文件可以通过两种方式存储在内存中。 自从您启动系统以来,您已经访问过该文件,无论是阅读它还是编写它。该文件将保留在内存中,直到有足够的内存需求将这些文件页从RAM中推出。由于这些是文件支持页面,因此任何已修改的页面将在页面被编写之前写入文件(MyReadFile.txt),然后提供给进程以供使用。 文件可以在内存中的第二种方式是SuperFetch看到对该文件的重复访问,并在磁盘空闲时主动将其加载到内存中。这样做是为了消除从磁盘读取数据时所经历的文件的延迟访问。     

要回复问题请先登录注册