Библиотека сайта 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
- systemtap-runtime
yum install systemtap systemtap-runtime
stap-prep
В том случае, если эта команда не сработает, попробуйте установить пакеты вручную в соответствии с инструкциями, приведенными ниже.
2.1.2. Установка необходимых пакетов с информацией о ядре ОС в ручном режиме
Системе SystemTap необходима информация о ядре ОС для корректного использования доступного инструментария по отношению к нему (другими словами, для его исследования). Данная информация также позволяет SystemTap генерировать код инструментальных модулей.
- kernel-debuginfo
- kernel-debuginfo-common
- kernel-devel
Аналогично, необходимыми пакетами для ядра ОС с поддержкой технологии PAE являются пакеты kernel-PAE-debuginfo, kernel-PAE-debuginfo-common и kernel-PAE-devel.
uname -r
- 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
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 предлагает возможность осуществления кроссинструментализации.
- Пакеты с информацией о ядрах ОС для различных машин могут устанавливаться на одной центральной машине (host machine).
- Для использования сгенерированного инструментального модуля SystemTap на каждой целевой машине (target machine) требуется установить единственный RPM-пакет: systemtap-runtime.
- Инструментальный модуль (instrumentation module) - модуль ядра ОС, созданный на основе сценария SystemTap. Это модуль, который создается средствами SystemTap на центральной системе и впоследствии загружается целевым ядром ОС целевой системы.
- Центральная система (host system) - система, на которой осуществляется компиляция инструментальных модулей на основе сценариев SystemTap с целью их последующей загрузки на целевых системах.
- Целевая система (target system) - система, для которой создаются инструментальные модули на основе сценариев SystemTap.
- Целевое ядро ОС (target kernel) - ядро ОС, задействованное на целевой системе. Это ядро ОС, при работе с которым вы намереваетесь загружать или применять инструментальный модуль.
- Установить пакет systemtap-runtime на каждой из целевых систем.
- Выяснить версию ядра ОС, используемого каждой из целевых систем, выполнив команду
uname -r
на каждой из этих систем. - Произвести установку SystemTap на центральной системе. Впоследствии вы будете осуществлять сборку инструментальных модулей для целевых систем именно на этой центральной системе. Обратитесь к Разделу 2.1.1, "Установка SystemTap" для получения инструкций относительно установки SystemTap.
- Используя полученную ранее информацию о версии целевого ядра ОС, следует установить пакет с целевым ядром ОС и связанные с ним 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 имя_файла
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 загружается в адресное пространство и начинается исследование параметров функционирования ядра ОС, реализация инструментария отсоединяется и исполняется в виде фонового процесса. В момент, когда наступает интересующее событие, вы можете повторно подсоединить реализацию инструментария для ознакомления с последними выведенными данными из буфера в памяти, а также отслеживания новых выводимых данных.
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 автоматически добавит суффикс с номером файла к имени создаваемого файла для отражения последовательности создания файлов.
/tmp/iotime.log.[0-9]+
, размер каждого из которых будет меньше или равен 1МБ, при этом на диске будут храниться только последние два файла:
stap -F -o /tmp/pfaults.log -S 1,2 pfaults.stp
kill -s SIGTERM 7590
ls -sh /tmp/pfaults.log.*
будет выведена информация о двух файлах:
1020K /tmp/pfaults.log.5 44K /tmp/pfaults.log.6
Для ознакомления с последней полученной информацией следует читать файл с самым большим числовым суффиксом, в нашем случае это файл /tmp/pfaults.log.6
.
Следующий раздел : Глава 3. Принцип работы SystemTap.