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中压入这些文件页面。 由于这些是文件支持的页面,所以在页面被xero化之前,任何被修改的文件都会被写入文件(MyReadFile.txt),然后被赋予一个进程使用。

文件可能在内存中的第二种方式是SuperFetch对该文件进行重复访问,并在磁盘空闲时主动将其加载到内存中。 这样做是为了消除从磁盘读取数据时遇到的延迟访问。