Начальное знакомство с возможностями и принципами работы с инструментами системного анализа и трассировки
В этой главе:
Во многих компьютерных средах разработчикам необходимо наблюдать за работой систем реального времени, уделяя особое внимание их основным структурным компонентам. Наблюдение позволяет обнаруживать скрытые неполадки оборудования, ошибки проектирования и реализации, а также увеличивать общую производительность системы.
В состав ЗОСРВ «Нейтрино» входят развитые механизмы трассировки и профилирования, с помощью которых можно анализировать работу системы как в реальном времени, так и автономно. В отличие от отладчиков, инструменты системного анализа работают на уровне операционной системы и позволяют анализировать поведение приложений, не изменяя их.
Инструменты системного анализа обладают следующими основными характеристиками:
В процессе работы системы выполняется большое количество неявных действий, таких как:
Перечисленные действия изменяют состояние системы, но, как правило, скрыты от внимания разработчиков. Инструменты системного анализа позволяют обнаруживать и регистрировать эти изменения. При регистрации каждого события указывается время и идентификатор процессора, который обработал его.
Инструменты системного анализа предоставляет ценную информацию о продукте на всех этапах его жизненного цикла — от создания прототипа до оптимизации, эксплуатационного контроля и диагностики.
Информация стандартных отладчиков не всегда достаточно подробна для устранения неполадок в сложных системах, а некорректное поведение процесса не обязательно обусловлено ошибками в его коде. В отличие от инструментов системного анализа, отладчики не собирают информацию о ходе выполнения приложений, которая необходима для решения разнообразных и сложных задач их «точной настройки». Традиционные средства отладки не позволяют с легкостью обнаруживать проблемы, обусловленные некорректным взаимодействием модулей масштабной системы, которая состоит из многочисленных взаимосвязанных компонентов или процессов. Отладчик наблюдает за одним процессом, а инструменты системного анализа — за всеми процессами одновременно. Кроме того, инструменты системного анализа позволяют следить за работой внешнего скомпилированного кода без его модификации.
Инструменты системного анализа представляют события в ядре на системном уровне, что позволяет анализировать и оптимизировать функционирование крупных взаимосвязанных систем и отдельных процессов, а также обнаруживать причины взаимных блокировок и конфликтов посредством отладки в реальном времени. Инструменты системного анализа дают возможность изучать поведение системы не по «стоп-кадрам», а как «фильм».
Поскольку диагностическая версия ядра почти не отличается от стандартной версии с точки зрения производительности, ее можно использовать на целевой системе. При возникновении неполадок в процессе эксплуатации можно использовать инструменты системного анализа для подробной низкоуровневой диагностики.
Инструменты системного анализа позволяют «бесконтактно» вводить диагностические средства в код — программы могут самостоятельно следить за собой. В дополнение к пассивной/бесконтактной трассировке событий разработчик может добавлять в программы собственные события-индикаторы.
Инструменты системного анализа ЗОСРВ «Нейтрино» состоят из следующих основных компонентов:
Диагностическая версия ядра ЗОСРВ «Нейтрино» включает в себя компактный высокоэффективный модуль сбора событий. В остальном она не отличается от обычного микроядра и уступает ему в производительности всего на 2%.
При выполнении потоков диагностический модуль непрерывно регистрирует действия ядра в кольцевом связанном списке буферов в виде событий с указанием времени и процессора. Поскольку трассировка осуществляется на уровне ядра, инструменты анализа системы могут наблюдать за выполнением всех процессов в системе, в том числе за программами сбора данных.
Чтобы определить, какая версия ядра используется в системе, введите команду:
ls /proc/boot
и найдите файл, в имени которого присутствует слово procnto. Если файл называется procnto-*instr, используется именно диагностическая версия ядра.
Чтобы переключить в систему диагностическое ядро, выполните следующие действия:
Буфер ядра состоит из множества небольших буферов. Несмотря на то, что их количество ограничивается только объемом памяти системы, важно следить за его расходованием. При трассировке всех событий работающей системы количество регистрируемых событий весьма велико.
Чтобы диагностическое ядро могло выполнять запись в одну часть буфера и при этом хранить данные в другой его части, буфер ядра организован в виде кольцевого связанного списка. Когда количество данных в буфере достигает высокой отметки (около 70%), диагностический модуль ядра отправляет программе сбора данных сигнал с адресом буфера. Затем программа сбора данных получает доступ к буферу и помещает его в хранилище для автономной обработки или передает интерпретатору данных для динамической обработки. В любом случае освобожденный буфер может снова использоваться ядром.
В состав ЗОСРВ «Нейтрино» входит утилита tracelogger для сбора данных. Она принимает события от диагностического ядра и сохраняет их в файле или отправляет на устройство для дальнейшего анализа.
![]() | Для выделения памяти под буферы и использования таких функций, как InterruptHookTrace(), утилиты сбора данных должны выполняться с привилегиями пользователя root ; в противном случае они не будут работать корректно. |
Поскольку утилита tracelogger может записывать данные со скоростью значительно выше 20 Мбайт/мин, ее длительное или частое использование приводит к расходованию больших объемов дискового пространства. Если на диске мало свободного места, следует регулярно удалять файлы журнала (по умолчанию утилита tracelogger перезаписывает содержимое прежнего файла, используемого по умолчанию).
Также можно выполнять трассировку в собственном приложении (например, включая ее только для проблемной области) при помощи вызова ядра TraceEvent(). Этот вызов выполняет более 30 команд, которые позволяют:
Дополнительную информацию см. в главе Сбор трассировочных данных настоящего руководства, описании утилиты tracelogger и функции TraceEvent().
Для облегчения обработки двоичных трассировочных данных используется библиотека libtraceparser. Ее API позволяет создавать функции, которые вызываются при заполнении элементов буфера данными о событиях, принимаемыми/считываемыми из необработанного двоичного потока событий.
Библиотека libtraceparser лежит в основе утилиты traceprinter, которая отображает все трассировочные события в порядке их генерации ядром и с соответствующими временными метками. Можно использовать API данной библиотеки для создания собственного анализатора, а также выполнять следующие действия в реальном времени:
Библиотека libtraceparser предоставляет API, который облегчает анализ и интерпретацию событий трассировки, хранящихся в файле событий, и позволяет:
Дополнительную информацию см. в главе Интерпретация трассировочных данных настоящего руководства, а также описании утилиты traceprinter.
Предыдущий раздел: перейти