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

Я запускаю 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 там не появляется.

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

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

Спасибо


person Andry    schedule 10.03.2011    source источник


Ответы (2)


Мониторинг файлового ввода-вывода не основан на выборке. Вместо этого соответствующий поставщик 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

С уважением, Гэри

person Gary Kratkin    schedule 10.03.2011

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

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

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

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

person Fred_Frog    schedule 21.04.2011
comment
Этот ответ правильный. Дисковый ввод-вывод записывает файловый ввод-вывод, который должен перейти на диск. Если дисковый кеш Windows работает правильно, то большинство файловых операций ввода-вывода не будут направляться на диск. Это хорошая вещь. Посмотрите на провайдеров файлового ввода/вывода. Разница между дисковым вводом-выводом и файловым вводом-выводом имеет решающее значение при анализе производительности. - person Bruce Dawson; 18.03.2014