litceysel.ru
добавить свой файл
  1 2 3 ... 7 8

Вступление

В этой работе будут рассматриваться, тестироваться и анализироваться современные инструменты профайлинга приложений. Данная работа является продолжением работы [40], в которой предпринималась попытка разработать альтернативный метод тестирования производительности программ.

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

В Главе 1 “Обзор” будет приведен исторический обзор этапов развития средств профайлинга, обзор наиболее известных и широко используемых в настоящее время инструментов. Также будут подробно рассмотрены основные методы профайлинга и прокоментирована обоснованность выбора профайлерами тех или иных единиц измерений.

В Главе 2 “Описание разработанного инструмента” представлено краткое описание утилиты, разработанной в рамках курсовой работы, и ряд доработок, которые были внесены в рамках дипломной работы.

В Главе 3 “Анализ” описаны некоторые размышления на тему возможности точных и идеальных измерений, а также задач, которые должны решаться профайлером.

В Главе 4 “Тестирование” будут представлены тесты, на которых осуществлялось тестирование профайлеров. Также описаны проблемы тестирования и их решения. К таким проблемам можно отнести автоматизацию тестирования, перевод единиц, случайные шумы в показаниях.

В Главе 5 “Результаты” перечислены некоторые значимые выводы, полученные из результатов тестирования профайлеров. Также вынесены некоторые оценки профайлерам, которые оценивались по качеству, удобству использования и универсальности.


В Главе 6 “Выводы” представлены главные выводы, которые были сделаны после проделанной работы.

Все материалы доступны по адресу:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2

1. Обзор


1.1. Определение профайлера

Под профайлером в данной работе мы будем понимать инструмент для оценки производительности программ и планирования работ по ее оптимизации. Это может быть как фон-Неймановская [18], так и Гарвардская архитектура [38]. Там программа рассматривается как последовательность команд, которая может содержать такие структуры как циклы, условные переходы, процедуры и другие. Из-за этих структур команды в программе исполняются неодинаковое число раз. Почти в любой программе можно найти некоторую последовательность команд, время и частота исполнения которых значительно выше, чем у других участков в программе. Такие участки будем называть “горячими” – на их исполнение тратится сравнительно больше тех или иных ресурсов компьютера. Очевидно, если удастся заменить этот “горячий” участок программы на аналогичный, результат выполнения которого тот же, но выполняющийся быстрее, то производительность программы возрастет значительно больше, чем при попытках замены “холодных” участков.

Главная задача профайлера – поиск таких “горячих” участков в программе. Ниже перечислены некоторые из ресурсов, расход которых способны измерять многие современные профайлеры:

  • количество тактов процессора,

  • количество выполненных инструкций,

  • количество промахов кеша,

  • количество неверно угаданных переходов,

  • количество обращений к кешу,

  • объем используемой памяти,

  • и многие другие.

Анализ информации о “нагретости” исполняемого кода помогает в изучении и анализе программы, планировании работ по оптимизации [19]. Большие и сложные программы изучаются быстрее и качественнее. Разработчик также может сравнивать результаты профайлинга с ожиданиями для соответствующих участков в программе и, тем самым, выявлять целый класс ошибок.


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

Часто профайлер выступают как экономически выгодный подход к оптимизации программ. Многие профессиональные профайлеры являются платными системами, и их цена колеблется в больших интервалах [13]. Эта цена определяется, главным образом, набором предлагаемых средств по оптимизации приложений, интерактивности и удобству использования. Многие предприятия готовы тратить немалые средства для повышения эффективности разрабатываемых ими систем.

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

1.2. История профайлера

Первые полноценные системы для профайлинга начали появляться в начале 70-х годов. Для платформ IBM/360 и IBM/370 были созданы средства, которые использовали прерывания программы по таймеру для сохранения их состояния [9]. Эти средства профайлинга можно назвать одними из первых, которые можно было отнести к методу семплирования.

Позже были созданы эмуляторы инструкций процессора, которые трассируют машинные команды и сами их исполняют. Так программа полностью находится под контролем профайлера, и становится возможно отслеживание всех событий, происходящих в ней. SIMON, SIMMON, OLIVER – некоторые из тех профайлеров.


В конце 70-х – начале 80-х в операционной системе Unix появляются инструменты и расширения к компиляторам, которые инструментируют программу еще при компиляции. К таким можно отнести профайлер prof, gprof.

Следующим этапом развития профайлера стало инструментирование скомпилированного бинарного кода. Первым из таких инструментов был ATOM [4], который появился в 1994 году. Он умел уже работать с объектными модулями.

В настоящее время с появлением байт-кода и множества виртуальных машин, таких как JVM, CLR, создаются инструменты профайлинга приложений, которые на них работают. В данном случае все решения схожи между собой, т.к. каждая из таких виртуальных машин предоставляет специальные интерфейсы для профайлинга. К таким инструментам относятся jTracert, CHESS.

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

1.3. Многообразие профайлеров

Из-за разнообразия [43] языков программирования, платформ, операционных систем, компиляторов и интерпретаторов в настоящее время существуют и продолжают появляться множество различных профайлеров. Все их можно разбить на классы по следующим признакам:


  • Статистические. Большинство из них используют метод семплирования. Профайлер работает уже скомпилированной программы.

  • Инструментирование. В исполняемый код тем или иным способом добавляются дополнительные команды, которые занимаются сбором информации.
  • Симуляция. Программа фактически не исполняется на процессоре. Его заменяет специальная программа – эмулятор.



Ниже приведена таблица с представителями каждого из классов:

Статистические

Intel VTune [17]

ориентирован на работу на процессорах Intel,

ОС – Windows и Linux

AMD CodeAnalyst [2]

ориентирован на работу на процессорах AMD,

ОС – Windows и Linux

AQTime [5]

ОС Windows, любой процессор

Shark [30]

ОС MacOS

Paraller Amplifier [12]

дополнительный инструмент для Microsoft Visual Studio, профайлинг многопоточных приложений

Инструментальные

Gprof [44] , Quantify [34]

дополнения к GCC

ATOM [4]

статическое инструментирование

Pin [32]

динамическое инструментирование,

ОС Windows, Linux, MacOS

Valgrind [35] [1]

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

ОС Linux и MacOS

DynInst [7]

динамическое инструментирование, мультиплатформенная библиотека

Dmalloc [6]

библиотека языка Си, отслеживает выделение и освобождение памяти

Turbo Profiler


устаревший профайлер компании Borland, который был разработан как дополнение для продуктов Turbo Pascal, Turbo C, Turbo Assembler. ОС DOS

Эмуляция

SIMMON, SIMON, OLIVER

устаревшие симуляторы инструкций на архитектуре IBM System 360/370/390

1.4. Современные профайлеры

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

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

Далее будет рассмотрен ряд систем, которые в настоящее время пользуются наибольшей популярностью. К таким средствам можно отнести:

  • Intel VTune – набор инструментальных средств, разработанный компанией Intel. Некоторая часть функциональности работает только на процессорах этой компании. Более подробное описание в соответствующем разделе.

  • AMD CodeAnalyst – продукт компании AMD. Также как и для Intel VTune, полный набор функциональности можно использовать лишь на процессорах компании AMD.
  • AQTime – универсальный инструмент, работающий на процессорах обеих фирм.


1.5. Принципы работы современных профайлеров

Все перечисленные профайлеры имеют схожие принципы работы. Основные методы:

  • семплирование – анализ программы на основе периодических замеров без изменения исполняемого кода,

  • инструментирование – здесь в исходные или машинные коды внедряются дополнительные команды, которые и производят необходимые замеры (времени, счетчиков процессора и т.д.).

1.5.1. Семплирование

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

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

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

1.5.2. Инструментирование


Представляет собой широкий класс приемов профайлинга. Метод инструментирования применяется в программирования для:


  • осуществления мониторинга и измерения уровня производительности приложения,

  • отладки и диагностики ошибок,

  • записи трассировочной информации.

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

Можно классифицировать множество способов внедрения в процесс исполнения приложения следующим образом:

  1. Статическое инструментирование

    1. добавление дополнительных команд в программу при компиляции,

    2. добавление команд в скомпилированные объектные файлы,

    3. добавление команд в исполняемые модули,

  2. Динамическое инструментирование

    1. перехват вызовов импортируемых и экспортируемых функций,

    2. анализ всей программы по мере ее исполнения.

1.6. Обзор современных профайлеров

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

1.6.1. Intel VTune performance analyzer

Intel VTune performance analyzer представляет из себя набор инструментов профилирования, который позволяет:

  • строить дерево вызовов,

  • производить статистический анализ кода (семплирование),

  • просматривать измерения на строчках исходного кода и на дизассемблированных инструкциях скомпилированного кода,
  • оптимизировать приложение в соответствии с рекомендациями, которые будет давать Intel VTune.


1.6.1.1. Описание

Intel VTune performance analyser является профессиональным платным коммерческим продуктом. Также компания Intel выпускает такие средства тестирования производительности, как Intel Thread Profiler, Intel Parallel Studio, специализирующиеся на тестировании и анализе активности исполняемых потоков. Все эти инструменты взаимно дополняют друг друга и составляют систему, которая не имеет аналогов в мире.

1.6.1.2. Принцип работы

В своих измерениях Intel VTune использует методы семплирования и инструментирования.

Сам Intel VTune performance analyzer предлагает сбор трех видов информации:

  1. Collect sampling data,

  2. Collect counter monitor data,

  3. Collect call graph data.

Collect sampling data.

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

Сейчас существуют десятки типов встроенных счетчиков, которые умеют подсчитывать:

  • количество тактов процессора,

  • количество промахов и попаданий в кэш первого и второго уровней,

  • количество выполненных инструкций,

  • количество верно и ошибочно предсказанных ветвлений,

  • количество прерываний,

  • другие.

Полный список событий, с которыми работают счетчики процессоров фирмы Intel, можно смотреть тут [14].

Существует два способа использования счетчиков [15]:

  1. простой подсчет событий,

  2. семплирование – процессор генерирует прерывание, когда показатель счетчика превышает определенное значение (при этом счетчик сбрасывается).

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

Collect counter monitor data.

Этот вид сбора данных использует счетчики по второму их назначению, а именно, обычный подсчет событий в системе.

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

Collect call graph data.

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

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


1.6.2. AMD CodeAnalyst

AMD CodeAnalyst – фирменный профайлер компании AMD. Он ориентирован на платформу x86 и разрабатывается для операционных систем Windows и Linux. Является бесплатным.

Позволяет производить следующие виды анализа [31]:


  • Access performance – первоначальный анализ приложения, чтобы определить дальнейшие направления для анализа,

  • Investigate L2 cache access – подробный анализ использования кеша второго уровня,

  • Investigate branching – подробный анализ использования модуля предсказания ветвлений,

  • Investigate data access – анализ использования памяти,

  • Investigate instruction access – анализ процесса чтения и исполнения инструкций,

  • Thread profile – анализ многопоточности и параллельного использования многоядерной или многопроцессорной системы.

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

1.6.3. AQTime

AQTime – профайлер компании AutomatedQA с проприетарной лицензией. Он работает на операционной системе Windows. Умеет встраиваться в популярные среды разработки такие как Microsoft Visual Studio, Borland Developer Studio, Embarcadero RAD Studio. Стоимость – от 600$.

Профайлер поддерживает следующие режимы:

  • Performance Profiler – считает время работы приложения и ее частей, единственный интересующий нас режим,

  • Platform Compliance – определяет совместимость программы с операционными системами,
  • Static Analysys – различные статистики программы, вычисляемые с использованием отладочной информации,


  • Load Library Tracer – поиск используемых динамических библиотек,

  • многие другие, ориентированные на dot.net приложения.

Режим «Performance Profiler». Этот режим профайлинга позволяет вычислять время работы как исполняемых модулей, так и отдельных функций. Профайлер предлагает следующие единицы измерений: секунды, миллисекунды, микросекунды, циклы процессора. Вместе с этим для каждой функции считается количество их вызовов.

1.6.4. Метод подсчета инструкций

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

Более подробное описание инструмента будет приведено в Главе 2. “Описание инструмента”.

1.7. Используемые единицы измерений

Важно отметить некоторые особенности у выбираемых профайлерами единиц измерений.

Если вернуться к системам, использующим процессоры i8086, i8088, i186, i286, i386, i486, то для них использовались единицы Clock [39]. Для всех инструкций было известно количество клоков, которое требовалось для их исполнения. Просуммировав эти значения для всех исполненных инструкций программы, можно тривиальным образом перевести значение в секунды и получить время исполнение программы в секундах.

В настоящее время секунды и клоки не так широко распространены как раньше. Вместо этого используется множество других единиц, которые, зачастую, далеки от секунд и не переводимы однозначно. Почему произошли такие изменения? Причины этому многократное усовершенствование процессора:


  • конвейерная обработка команд,

  • кеши различных уровней,

  • предсказания ветвлений,

  • технологии Hyper-threading и Super-threading.

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

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

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



<< предыдущая страница   следующая страница >>