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

时间:2011-03-10 15:05:11

标签: .net windows performance xperf

我运行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采样频率太低了?我怎样才能改变它?...

然而,我的程序读取文件,我敢肯定,程序启动并打印出内容......

由于

2 个答案:

答案 0 :(得分:2)

DiagEasy打开IO进出磁盘的ETW工具。如果文件已经在内存中,那么就没有IO。您需要打开上面Gary所描述的FILE_IO和FILE_IO_INIT事件来捕获所有文件访问,甚至是当前在内存中的文件。

你可能会问为什么文件在内存中。收集数据时,文件可以通过两种方式存储在内存中。

自从您启动系统后,您已经访问过该文件,无论是阅读它还是编写它。该文件将保留在内存中,直到有足够的内存需求将这些文件页从RAM中推出。由于这些是文件支持的页面,因此任何已修改的页面将在页面被编写之前写入文件(MyReadFile.txt),然后提供给进程以供使用。

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

答案 1 :(得分:1)

文件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

此致 加里