Действие Windows Xperf diskio не показывает мне файл, который программа читает во время сеанса трассировки производительности - PullRequest
1 голос
/ 10 марта 2011

Я запускаю xperf, чтобы получить информацию о трассировке для программы при ее запуске.Программа читает файл.Это программа .NET, написанная на F #, файл читается здесь:

System.IO.File.ReadAllLines("MyReadFile.txt")

Хорошо.Я запускаю xperf:

xperf -on DiagEasy

Я прекращаю xperf и объединяю в файл:

xperf -d myfile.etl

OK.

Теперь я пишу:

xperf -i myfile.etl -o myfile_stat.txt -a diskio -detail

Я делаю это, чтобы получить файл со всей информацией о файлах.Показанный файл является текстовым файлом, отформатированным для того, чтобы я мог видеть статистику диска по файлу.Каждый файл, которым манипулировали во время сеанса трассировки, показан с большим количеством данных относительно процесса, который прочитал / записал файл и так далее ...

Но MyReadFile.txt там не появляется.

Зачем?????Это потому, что частота дискретизации процессора слишком низкая?Как я могу это изменить? ...

Однако моя программа читает файл, я уверен, что программа запускается и распечатывает содержимое ...

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

DiagEasy включает инструментарий ETW для ввода / вывода с диска.Если файл уже находится в памяти, ввода-вывода не будет.Вам нужно включить события FILE_IO и FILE_IO_INIT, как описано выше Гэри, чтобы захватить все обращения к файлам, даже к файлам, находящимся в данный момент в памяти.

Возможно, вы спрашиваете, почему файл находится в памяти.Существует два способа, которыми файл может находиться в памяти при сборе данных.

Вы получили доступ к файлу с самого начала, так как загрузили систему либо для чтения, либо для записи.Файл будет оставаться в памяти, пока не будет достаточно памяти, чтобы эти страницы файла были вытеснены из ОЗУ.Так как это страницы с файловой поддержкой, любые измененные файлы будут записаны в файл (MyReadFile.txt) перед тем, как страницы будут ксероксированы, а затем переданы процессу для использования.

Второй способ - файлможет быть в памяти, что SuperFetch видел повторный доступ к этому файлу и предварительно загружал его в память, когда диск в противном случае простаивал.Это сделано для того, чтобы исключить задержки доступа к файлу при чтении данных с диска.

1 голос
/ 10 марта 2011

Контроль файлового ввода-вывода не основан на выборке. Вместо этого соответствующий поставщик ETW вызывает события для каждого отслеживаемого ввода-вывода. Это не должно пропустить ничего.

Если бы это был мой код, я бы заподозрил, что он не прочитал файл. 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

С уважением, Gary

...