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 は、ディスクとの間の IO 用に ETW インストルメンテーションをオンにします。ファイルが既にメモリ内にある場合、IO は発生しません。上記の Gary で説明されているように、FILE_IO および FILE_IO_INIT イベントをオンにして、現在メモリ内にあるファイルであっても、すべてのファイル アクセスをキャプチャする必要があります。

ただし、ファイルがメモリ内にある理由を尋ねる場合があります。データを収集したときにファイルがメモリ内に存在する方法は 2 つあります。

システムを起動してから、読み取りまたは書き込みのためにファイルにアクセスしました。これらのファイル ページが RAM からプッシュされるのに十分なメモリ需要が発生するまで、ファイルはメモリ内に残ります。これらはファイルに裏打ちされたページであるため、変更されたものはすべてファイル (MyReadFile.txt) に書き込まれてから、ページがゼロ化されてからプロセスに渡されて使用されます。

ファイルがメモリ内にある可能性がある 2 つ目の方法は、SuperFetch がこのファイルへの繰り返しのアクセスを検出し、ディスクがアイドル状態のときに事前にファイルをメモリにロードしたことです。これは、ディスクからデータを読み取るときに発生するファイルへのアクセスの待ち時間をなくすために行われます。

于 2011-04-21T06:45:08.870 に答える
1

ファイル I/O の監視は、サンプリングに基づいていません。代わりに、関連する ETW プロバイダーが、監視対象の I/O ごとにイベントを発生させます。何も見逃してはいけません。

これが私のコードだったら、実際にはファイルを読み取っていなかったのではないかと思います。ERROR_FILE_NOT_FOUND、おそらく?

また、そのフラグは EasyDiag ではなく、DiagEasy である必要があります。

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 に答える