Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Руководство для начинающих пользователей SystemTap. Использование SystemTap

Оригинал: SystemTap Beginners Guide
Авторы: Don Domingo, William Cohen
Дата публикации: 20 июля 2009 г.
Перевод: А.Панин
Дата перевода: 28 сентября 2014 г.

Глава 2. Использование SystemTap

В данной главе описывается процесс установки SystemTap в систему, а также даются пояснения относительно использования утилиты stap для запуска сценариев SystemTap.

2.1. Установка и настройка

Для развертывания системы SystemTap следует установить пакеты SystemTap вместе набором соответствующих пакетов для разработки с суффиксом -devel и пакетов с отладочными данными с суффиксами -debuginfo и -debuginfo-common для вашего ядра ОС. В том случае, если в вашей системе установлено несколько версий ядер ОС и вы намереваетесь использовать SystemTap для работы более чем с одним из этих ядер, вам также придется установить пакеты с суффиксами -devel и -debuginfo для каждой версии ядра ОС.

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

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

2.1.1. Установка SystemTap

Для развертывания системы SystemTap вам необходимо установить следующие RPM-пакеты:
  • systemtap
  • systemtap-runtime
Для этого выполните следующую команду, предварительно получив привилегии пользователя root:
yum install systemtap systemtap-runtime
Учтите, что перед тем, как вы сможете использовать SystsemTap, вам придется дополнительно установить требуемые пакеты с информацией о ядре ОС. В современных системах, при условии обладания привилегиями пользователя root, для установки этих пакетов вы можете просто выполнить команду:
stap-prep

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

2.1.2. Установка необходимых пакетов с информацией о ядре ОС в ручном режиме

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

Необходимая информация содержится в пакетах с суффиксами -devel, -debuginfo и -debuginfo-common, соответствующих пакету с вашим ядром ОС. Необходимыми пакетами с суффиксами -devel и -debuginfo для обычного "ванильного" ядра ОС являются следующие пакеты:
  • kernel-debuginfo
  • kernel-debuginfo-common
  • kernel-devel

Аналогично, необходимыми пакетами для ядра ОС с поддержкой технологии PAE являются пакеты kernel-PAE-debuginfo, kernel-PAE-debuginfo-common и kernel-PAE-devel.

Для определения используемой на данный момент версии ядра ОС вы можете использовать команду:
uname -r
Например, в том случае, если вы намереваетесь использовать SystemTap на машине архитектуры i686 под управлением ОС с версией ядра 2.6.18-53.el5, вам необходимо скачать и установить следующие RPM-пакеты:
  • kernel-debuginfo-2.6.18-53.1.13.el5.i686.rpm
  • kernel-debuginfo-common-2.6.18-53.1.13.el5.i686.rpm
  • kernel-devel-2.6.18-53.1.13.el5.i686.rpm
Важная информация
Версия, вариант и архитектура пакетов с суффиксами -devel, -debuginfo и -debuginfo-common должны точно совпадать с соответствующими параметрами пакета с ядром ОС, которое вы планируете исследовать с помощью SystemTap.

Простейший способ установки требуемых пакетов с информацией о ядре ОС заключается в использовании команд yum install и debuginfo-install. Приложение debuginfo-install включено в последние версии пакета yum-utils (примером может служить версия 1.1.10) и требует созданного соответствующим образом репозитория yum, из которого будут загружаться и устанавливаться пакеты с суффиксами -debuginfo и -debuginfo-common. Таким образом вы сможете установить требуемые пакеты с суффиксами -devel, -debuginfo и -debuginfo-common для вашего ядра ОС.

После того, как подходящие репозитории программного обеспечения подключены, вы можете установить пакеты, соответствующие определенному ядру ОС, воспользовавшись следующими командами:
yum install имя_ядра-devel-версия

debuginfo-install имя_ядра-версия
Замените строку имя_ядра на подходящий вариант имени пакета ядра ОС (например, kernel-PAE), а строку версия - на версию целевого ядра ОС. Например, для установки требуемых пакетов с информацией о ядре ОС для пакета с ядром ОС kernel-PAE-2.6.18-53.1.13.el5 следует выполнить следующие команды:
yum install kernel-PAE-devel-2.6.18-53.1.13.el5

debuginfo-install kernel-PAE-2.6.18-53.1.13.el5
Если же вы вручную скачали требуемые пакеты, используйте следующую команду от имени пользователя root для их установки:
rpm --force -ihv имена_пакетов

2.1.3. Начальное тестирование

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

Для запуска тестирования выполните следующую команду:
stap -v -e 'probe vfs.read {rpintf("осуществлено чтение данных\n"); exit()}'

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

Последние три строки вывода (начиная с Pass 5) говорят о том, что системе SystemTap удалось успешно создать инструментальный модуль для исследования ядра ОС, использовать этот инструментальный модуль, установить момент наступления интересующего события (в данном случае операции чтения из виртуальной файловой системы) и выполнить корректный обработчик этого события (вывести текст и завершить работу без ошибок).

2.2. Генерация инструментальных модулей для других компьютеров

После того, как пользователи выполняют сценарий SystemTap, на основе этого сценария средствами SystemTap создается модуль ядра ОС. Впоследствии SystemTap загружает этот модуль посредством механизмов ядра ОС, что делает возможным извлечение обозначенных данных непосредственно на уровне ядра ОС (обратитесь к списку операций с названием Процедура 3.1, "Сессия SystemTap" из Раздела 3.1, "Архитектура" для получения дополнительной информации).

В обычных условиях, однако, сценарии SystemTap могут исполняться исключительно на тех системах, на которых произведено развертывание системы SystemTap (таким же образом, как описано в Разделе 2.1, "Установка и настройка"). Это значит, что в том случае, если вы захотите использовать SystemTap на десяти системах, вам придется осуществить развертывание системы SytemTap на всех этих системах. В некоторых случаях такое решение может оказаться как неосуществимым, так и нежелательным. Например, корпоративные правила могут запрещать администратору осуществлять установку RPM-пакетов, содержащих компиляторы или отладочную информацию, на определенных машинах, что не позволит произвести развертывание системы SystemTap на них. Для обхода этой проблемы SystemTap предлагает возможность осуществления кроссинструментализации.

Кросинструментализация является процессом, в ходе которого SystemTap генерирует инструментальный модуль на основе сценария SystemTap на одном компьютере с целью его последующего использования на другом компьютере. Данный подход имеет следующие преимущества:
  • Пакеты с информацией о ядрах ОС для различных машин могут устанавливаться на одной центральной машине (host machine).
  • Для использования сгенерированного инструментального модуля SystemTap на каждой целевой машине (target machine) требуется установить единственный RPM-пакет: systemtap-runtime.
Для простоты в данном разделе будут использоваться следующие термины:
  • Инструментальный модуль (instrumentation module) - модуль ядра ОС, созданный на основе сценария SystemTap. Это модуль, который создается средствами SystemTap на центральной системе и впоследствии загружается целевым ядром ОС целевой системы.
  • Центральная система (host system) - система, на которой осуществляется компиляция инструментальных модулей на основе сценариев SystemTap с целью их последующей загрузки на целевых системах.
  • Целевая система (target system) - система, для которой создаются инструментальные модули на основе сценариев SystemTap.
  • Целевое ядро ОС (target kernel) - ядро ОС, задействованное на целевой системе. Это ядро ОС, при работе с которым вы намереваетесь загружать или применять инструментальный модуль.
Для настройки центральной и целевых систем вы должны выполнить следующие шаги:
  1. Установить пакет systemtap-runtime на каждой из целевых систем.
  2. Выяснить версию ядра ОС, используемого каждой из целевых систем, выполнив команду uname -r на каждой из этих систем.
  3. Произвести установку SystemTap на центральной системе. Впоследствии вы будете осуществлять сборку инструментальных модулей для целевых систем именно на этой центральной системе. Обратитесь к Разделу 2.1.1, "Установка SystemTap" для получения инструкций относительно установки SystemTap.
  4. Используя полученную ранее информацию о версии целевого ядра ОС, следует установить пакет с целевым ядром ОС и связанные с ним RPM-пакеты на центральной системе таким же образом, как описано в Разделе 2.1.2, "Установка требуемых пакетов с информацией о ядре ОС в ручном режиме". В том случае, если множество целевых систем использует различные версии целевых ядер ОС, следует повторить данный шаг для каждой из версий ядер ОС, используемых на целевых системах.

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

Для сборки инструментального модуля следует выполнить следующую команду на центральной системе (убедитесь в том, что вы используете корректные аргументы):
stap -r версия_ядра сценарий -m имя_модуля

В данном случае аргумент версия_ядра соответствует версии целевого ядра ОС (которая была определена с помощью команды uname -r, выполненной на целевой системе), аргумент сценарий соответствует сценарию, который будет преобразован в инструментальный модуль, а аргумент имя_модуля - желаемому имени инструментального модуля.

Примечание
Для определения архитектуры используемого ядра ОС вы можете выполнить следующую команду:
uname -m
	
После того, как инструментальный модуль скомпилирован, следует скопировать его в целевую систему, после чего загрузить с помощью команды:
staprun имя_модуля.ko
Например, для создания инструментального модуля с именем simple.ko на основе сценария с именем simple.stp для целевого ядра ОС версии 2.6.18-92.1.10.el5 (для архитектуры x86_64), следует использовать следующую команду:
stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple
В ходе исполнения данной команды будет создан модуль с именем simple.ko. Для использования этого инструментального модуля, скопируйте его в целевую систему и выполните следующую команду (на целевой системе):
staprun simple.ko
Важная информация
Для того, чтобы собранный инструментальный модуль корректно функционировал, центральная система должна быть той же архитектуры, что и целевая система, кроме того, она должна работать под управлением того же дистрибутива Linux, что и целевая система.

2.3. Исполнение сценариев SystemTap

В комплект поставки SystemTap входит множество инструментов с интерфейсом командной строки, позволяющих осуществлять мониторинг операций, выполняемых в рамках системы. Команда stap осуществляет чтение инструкций из файла сценария SystemTap, преобразование этих инструкций в код на языке программирования C, сборку модуля ядра ОС и загрузку этого модуля в адресное пространство функционирующего ядра ОС. Команда staprun осуществляет применение инструментария, представленного в форме модуля ядра ОС, который был собран на основе сценария SystemTap в процессе кроссинструментализации.

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

stapdev

Участники данной группы могут использовать команду stap для запуска сценариев SystemTap или команду staprun для задействования инструментальных модулей SystemTap.

Запуск команды stap приводит к компиляции сценариев SystemTap в модули ядра ОС и загрузке последних в адресное пространство ядра ОС. Данная операция требует повышенных привилегий пользователя в системе, которые предоставляются участникам группы stapdev. К сожалению, такие привилегии также позволяют пользователям из группы stapdev осуществлять доступ к системе с эффективными правами пользователя root. Исходя из этого, предоставляйте членство в группе stapdev только тем пользователям, которым вы могли бы доверить осуществление доступа к системе с правами пользователя root.

stapusr

Участники данной группы могут использовать исключительно команду staprun для задействования инструментальных модулей SystemTap. К тому же, они могут задействовать исключительно модули из директории /lib/modules/kernel_version/systemtap/. Обратите внимание на то, что владельцем данной директории должен быть исключительно пользователь root, причем запись в нее должна быть доступна также исключительно для пользователя root.

Утилита stap осуществляет чтение сценария SystemTap либо из файла, либо из потока стандартного ввода. Для того, чтобы сообщить о необходимости чтения данных сценария SystemTap из файла при работе с утилитой stap, укажите имя файла в командной строке:
stap имя_файла
Для того, чтобы сообщить о необходимости чтения данных сценария SystemTap из потока стандартного ввода при работе с утилитой stap, следует использовать аргумент - вместо имени файла. Обратите внимание на то, что любые аргументы интерфейса командной строки, которые вы желаете использовать, должны быть расположены до аргумента -. Например, для ознакомления с более подробным выводом утилиты stap вы можете использовать команду:
echo "probe timer.s(1) {exit()}" | stap -v -

Ниже приведен список часто используемых аргументов утилиты stap:

-v
Делает вывод данных сессии SystemTap более подробным. Вы можете повторять этот аргумент несколько раз для получения большего объема информации о ходе исполнения сценария, например:
stap -vvv script.stp

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

-o имя_файла

Перенаправляет поток стандартного вывода в файл с заданным именем.

-S размер,количество

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

-x идентификатор_процесса

Ассоциирует функцию обработчика SystemTap target() с заданным идентификатором процесса. Для получения дополнительной информации о функции target() обратитесь к описанию функций SystemTap.

-c 'команда'

Ассоциирует функцию обработчика SystemTap target() с заданной командой и задействует инструментарий SystemTap в процессе выполнения этой команды. Для получения дополнительной информации о функции target(), обратитесь к описанию функций SystemTap.

-e 'сценарий'

Использует строковое представление сценария вместо данных из файла сценария в качестве входных данных транслятора.

-F

Использует режим "черного ящика" SystemTap и создает фоновый процесс на основе сценария. Для получения дополнительной информации о режиме "черного ящика" обратитесь к Разделу 2.3.1, "Режим "черного ящика" SystemTap".

Для получения дополнительной информации о команде stap обратитесь к странице руководства stap(1). Дополнительная информация об утилите staprun, а также о процессе кроссинструментализации представлена в Разделе 2.2, "Генерация инструментальных модулей для других компьютеров" и на странице руководства staprun(8).

2.3.1. Режим "черного ящика" SystemTap

Режим "черного ящика" SystemTap позволяет исполнять сценарий SystemTap в течение длительных промежутков времени и фокусироваться на недавно выведенных данных. При этом режим "черного ящика" ограничивает объем генерируемых выводимых данных.

Существуют два варианта режима "черного ящика": режим с сохранением данных в памяти (in-memory mode) и режим с сохранением данных в файле (file mode). В обоих режимах сценарий SystemTap исполняется как фоновый процесс.

2.3.1.1. Режим "черного ящика" с сохранением данных в памяти

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

Для исполнения сценария SystemTap в режиме "черного ящика" с сохранением данных в памяти следует использовать утилиту stap с аргументом командной строки -F:
stap -F iotime.stp
После запуска сценария утилита stap выведет аналогичное следующему сообщение для того, чтобы проинформировать вас о команде, которую нужно будет использовать для повторного соединения с исполняющимся сценарием:
Disconnecting from systemtap module.
To reconnect, type "staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556"
При наступлении интересующего события следует использовать следующую команду для соединения с исполняющимся в данный момент сценарием, ознакомления с последними выведенными сценарием данными из буфера в памяти, а также отслеживания выводимых в реальном времени данных:
staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556

По умолчанию буфер в ядре ОС имеет размер 1МБ. Вы можете увеличить это значение, использовав аргумент -s с соответствующим значением размера буфера в мегабайтах (которое будет округлено до следующей степени числа 2). Например, аргумент -s2 в командной строке SystemTap позволяет указать размер буфера в 2МБ.

2.3.1.2. Режим "черного ящика" с сохранением данных в файле

При работе в режиме "черного ящика" данные также могут сохраняться в файлах. Вы можете контролировать количество и размер хранимых на диске файлов с помощью аргумента -S, за которым должны следовать два числовых значения, разделенных с помощью запятой: первый аргумент устанавливает максимальный размер каждого из создаваемых файлов в мегабайтах, а второй - количество хранимых файлов. Для указания имени файла следует использовать параметр -o, после которого должно быть записано само имя файла. SystemTap автоматически добавит суффикс с номером файла к имени создаваемого файла для отражения последовательности создания файлов.

Следующая команда позволяет использовать SystemTap в режиме "черного ящика", причем данные будут сохраняться в файлах с именами /tmp/iotime.log.[0-9]+, размер каждого из которых будет меньше или равен 1МБ, при этом на диске будут храниться только последние два файла:
stap -F -o /tmp/pfaults.log -S 1,2 pfaults.stp
При использовании этой команды в стандартный поток вывода будет передана информация об идентификаторе созданного процесса. Отправка сигнала SIGTERM процессу с данным идентификатором приведет к прекращению исполнения сценария SystemTap и остановке процесса сбора данных. Например, в том случае, если в результате выполнения приведенной выше команды была получена информация об идентификаторе процесса 7590, следующая команда позволит остановить исполнение сценария SystemTap:
kill -s SIGTERM 7590
В данном случае на диске будут храниться только два файла, сгенерированные сценарием в последнюю очередь: SystemTap будет автоматически удалять устаревшие файлы. В результате с при использовании команды ls -sh /tmp/pfaults.log.* будет выведена информация о двух файлах:
1020K /tmp/pfaults.log.5    44K /tmp/pfaults.log.6

Для ознакомления с последней полученной информацией следует читать файл с самым большим числовым суффиксом, в нашем случае это файл /tmp/pfaults.log.6.


Следующий раздел : Глава 3. Принцип работы SystemTap.