1

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

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

谢谢

4

2 回答 2

2

DiagEasy 打开 ETW 检测以实现与磁盘之间的 IO。如果文件已经在内存中,则不会有 IO。您需要按照上面 Gary 的描述打开 FILE_IO 和 FILE_IO_INIT 事件,以捕获所有文件访问,甚至是当前在内存中的文件。

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

自从您启动系统以来,您已经访问过该文件,要么读取它,要么写入它。该文件将保留在内存中,直到有足够的内存需求以将这些文件页面从 RAM 推送。由于这些是文件支持的页面,因此在对页面进行 xero 处理之前,任何已修改的内容都将写入文件 (MyReadFile.txt),然后提供给进程以供使用。

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

于 2011-04-21T06:45:08.870 回答
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

问候,加里

于 2011-03-10T17:19:12.123 回答