2009-01-29 3 views
8

Наш сбор досадно медленно. Это Java-система, построенная с Ant, и я запускаю свою версию в Windows XP. В зависимости от аппаратного обеспечения для завершения может потребоваться от 5 до 15 минут.Как я могу профилировать ввод-вывод файлов?

Наблюдение общих показателей производительности на машине, а также сопоставление аппаратных различий со временем сборки указывает на то, что процесс связан с вводом-выводом. Это также показывает, что процесс делает намного больше, чем чтение.

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

Что такое инструменты для профилирования, которые расскажут мне, что делает данный процесс с файлами? Бесплатно - это хорошо, но не обязательно.


Использование Process Monitor, as suggested by Jon Skeet, я был в состоянии подтвердить мое подозрение: почти все диска активности чтения и повторного чтения библиотек, с копиями в комплекте JDK из «rt.jar» и других библиотек в верхней части список. Я не могу сделать RAM-диск достаточно большим для хранения всех библиотек, которые я использовал, но установка «самых горячих» библиотек на RAM-диске сокращает время сборки примерно на 40%; Очевидно, кэширование файловой системы Windows не делает достаточно хорошей работы, хотя я сказал Windows оптимизировать для этого.

Я заметил, что типичная операция чтения в файле JAR составляет всего несколько десятков байтов; обычно есть два или три из них, за которым следует пропустить несколько килобайт в файле. Казалось, он плохо подходит для массовых чтений.

Я собираюсь провести дополнительное тестирование с всеми моих сторонних библиотек на флеш-накопителе и посмотреть, что это за эффект.

+0

Один быстрый вопрос erickson, как вы выяснили, сколько байтов считывается с ProcessMonitor? У меня такая же проблема, пытаясь профилировать наши сборки с помощью Windows XP. –

+0

. Только что вычисленный сейчас, например, в столбце «Сведения» для операций ReadFile, он говорит «Смещение: N байтов», «Длина: M байтов» и т. Д. –

ответ

7

Если вам только нужен он для Windows, SysInternals Process Monitor должен показать вам все, что вам нужно знать. Вы можете выбрать процесс, а затем просмотреть каждую операцию, как она есть, и получить сводную информацию о работе файла.

+0

Спасибо, Джон. В прошлом я использовал Process Explorer. Является ли это преемником этого продукта или что-то совершенно отдельное? – erickson

+0

Process Explorer - это своего рода альтернатива менеджера задач. Process Monitor показывает вам каждую операцию ввода-вывода, такую ​​как открытие файла, запись в реестр и т. Д. ... – lacop

0

Я использовал для создания массивного Java Webapp (JSP-интерфейс), используя Ant в Windows, и это займет 3 минуты. Я вытер свой компьютер и установил Linux, и внезапно сборка заняла 18 секунд. Это реальные цифры, хотя и около трех лет. Я могу только предположить, что Java предпочитает модели управления памятью и потоками Linux для эквивалентов Windows, поскольку все Java-программы, по моему опыту, лучше работают под Linux (особенно Eclipse). Linux кажется намного лучше предотвращать дополнительные чтения с диска, когда вы много читаете файлы, которые не изменились (например, exectuables и библиотеки). Это может быть свойство кеша диска или файловой системы, я не уверен, что.

Одна из замечательных особенностей Java заключается в том, что она является кросс-платформенной, поэтому настройка сервера сборки на базе Linux на самом деле является для вас вариантом. Будучи чем-то вроде евангелиста Linux, я бы предпочел, чтобы вы переключили среду разработки в Linux, но я знаю, что многие люди не хотят этого делать (или не могут по практическим соображениям).

Если вы не хотите даже настроить сервер сборки Linux, чтобы убедиться, что он работает быстрее, вы можете хотя бы попробовать дефрагментировать жесткий диск вашей Windows-машины. Это имеет огромное значение для сборки C++ на моем рабочем компьютере. Попробуйте JkDefrag, который кажется намного лучше, чем дефрагментатор, который поставляется с Windows.

EDIT: Я бы предположил, что у меня есть нижний предел, потому что в моем ответе не указан точный вопрос. Тем не менее, традиция StackOverflow помогает людям исправить свою реальную проблему, а не просто лечить симптомы. Я не из тех людей, для которых ответ на каждый вопрос - «использование linux». В этом случае, однако, у меня есть очень реальные, измеренные показатели производительности в той ситуации, о которой спрашивает OP, поэтому я решил поделиться своим опытом.

+0

, в то время как я не сомневаюсь, что переключение на Linux улучшит производительность, вряд ли это ответ на вопрос о профилировании ввода-вывода в окнах – sgibbons

+0

. Спасибо rmeador , Многие наши разработчики запускают Linux, и это действительно помогает. Его кеш файловой системы кажется намного лучше, чем Windows. Также есть подозрение, что Microsoft сознательно ковыряла производительность вызовов ядра с помощью кода, отличного от M $. ;) Однако даже сборки Linux слишком медленны. – erickson

1

Назад, когда я все еще пользовался Windows Я использовал для получения хороших результатов, ускоряющих мою сборку, имея все выходные данные сборки, написанные на отдельный раздел, если возможно 3   ГБ по размеру, и периодически форматируя это ночью один раз в неделю по расписанию задача. Это просто сборка, поэтому не имеет значения, будет ли она в одностороннем порядке сплющиваться изредка.

Но, честно говоря, так как переезд в Linux, фрагментация диска - это то, о чем я больше не беспокоюсь.

Еще одна причина, чтобы попробовать свои сборки на Linux, по крайней мере, один раз, так что вы можете запустить strace (grepped для звонков в открытой), чтобы увидеть, какие файлы билд соприкасались.

+1

Procmon/Filemon дают аналогичную (фактически) информацию для strace. Я смог увидеть каждый открытый, метаданных запрос, чтение и запись. – erickson

1

Старое, но доброжелательное: создайте RAM-диск и скомпилируйте свои файлы оттуда.

+0

Моя цель с профилированием IO состоит в том, чтобы выяснить, что больше всего выиграет от работы с RAM-диском. – erickson

0

На самом деле FileMon - это более прямой инструмент, чем ProcMon. В целом, при выполнении анализа производительности для дисковых операций ввода/вывода, рассмотрим следующие два:

  • Пропускная способность (скорость чтения/записи байтов в секунду)
  • Latency (сколько в ожидании в очереди для чтения/записи)

После того, как вы оцениваете работу вашей системы с точки зрения вышеизложенного, можно легко определить узкие места и предпринять корректирующие действия: получить более быстрые диски или изменить свой код (в зависимости от того работает дешевле).

+2

Фактически FileMon был устаревшей подмножеством версии ProcMon к моменту вашего ответа. -1. – 0xC0000022L

Смежные вопросы