Библиотека сайта rus-linux.net
Руководство для начинающих пользователей SystemTap. Полезные сценарии SystemTap
Оригинал: SystemTap Beginners GuideАвторы: Don Domingo, William Cohen
Дата публикации: 20 июля 2009 г.
Перевод: А.Панин
Дата перевода: 3 октября 2014 г.
Глава 5. Полезные сценарии SystemTap
5.2. Диск
В следующих разделах будут продемонстрированы сценарии, предназначенные для мониторинга работы дисковой подсистемы и активности операций ввода/вывода.
5.2.1. Подсчет объема данных при чтении данных с диска/записи данных на диск
В данном разделе описывается способ идентификации процессов, наиболее интенсивно читающих данные с дисков/записывающих данные на диски в системе.
disktop.stp
UID
- идентификатор пользователя. Идентификатор пользователя0
соответствует учетной записи пользователя с именем root.PID
- идентификатор процесса из списка.PPID
- идентификатор родительского процесса для процесса из списка.КОМАНДА
- имя процесса из списка.УСТРОЙСТВО
- имя файла устройства, с которого читает данные или на которое записывает данные процесс из списка.T
- тип операции, выполняемой процессом из списка; символW
соответствует операции записи,R
- операции чтения.БАЙТЫ
- объем данных, прочитанных с диска или записанных на диск.
Строки времени и даты, выводимые сценарием disktop.stp, генерируются с помощью функций ctime()
и gettimeofday_s()
. Функция ctime()
преобразует в строку значение календарного времени в секундах с начала эпохи Unix (1 января 1970). Функция gettimeofday_s
подсчитывает действительное количество секунд с начала эпохи Unix, на основе которого может быть сгенерировано достаточно точное, читаемое строковое представление даты и времени.
В данном сценарии переменная $return
является локальной переменной, хранящей действительное количество байт, которое каждый процесс читает из виртуальной файловой системы или записывает в нее. Переменная $return
может использоваться исключительно в зондах для отслеживания событий выхода из функций (например, vfs.read.return
и vfs.write.return
).
Пример 5.6, "Вариант вывода сценария disktop.stp"
5.2.2. Отслеживание затрат времени на операции ввода/вывода для каждой операции чтения или записи
В данном разделе описывается способ мониторинга затрат времени на выполнение каждой операции чтения из произвольного файла или записи в произвольный файл. Этот мониторинг полезен для установления того, какие файлы медленно обрабатываются на используемой системе.
iotime.stp
Сценарий iotime.stp отслеживает каждый системный вызов, который используется для открытия файла, закрытия файла, чтения данных из файла и записи данных в файл. При каждом доступе к файлу посредством системного вызова сценарий iotime.stp подсчитывает количество микросекунд, которые требуются для завершения операций чтения данных из файла и записи данных в файл и отслеживает объем данных (в байтах), прочитанных из файла или записанных в файл.
Также сценарий iotime.stp использует локальную переменную $count
для отслеживания объема данных (в байтах), который процесс пытается прочитать из файла или записать в файл с помощью системного вызова. Обратите внимание на то, что переменная $return
(которая используется также и в сценарии disktop.stp из Раздела 5.2.1, "Подсчет объема данных при чтении данных с диска/записи данных на диск") хранит реальный объем прочитанных с диска/записанных на диск данных. Переменная $count
может использоваться исключительно в рамках зондов, которые отслеживают операции чтения и записи данных (таких, как syscall.read
и syscall.write
).
Пример 5.7. Вариант вывода сценария iotime.stp
- Метку времени в микросекундах
- Идентификатор процесса и имя процесса
- Флаг
операции доступа
иливремени доступа
к данным - Имя файла, к которому осуществлялся доступ
Если процессу удалось прочитать или записать данные, строки с информацией о доступе к данным
и времени доступа к данным
должны появиться практически одновременно. Метка времени строки с информацией о доступе к данным
соответствует моменту, когда заданный процесс осуществлял доступ к файлу; в конце этой строки должна быть приведена информация об объеме прочитанных/записанных данных (в байтах). Строка с информацией о времени доступа к данным
содержит информацию о времени (в микросекундах), которое потребовалось процессу для выполнения операции чтения данных из файла или записи данных в файл.
В том случае, если после строки с информацией о доступе к данным
не было выведено строки с информацией о времени доступа к данным
, процесс не осуществлял чтение или запись данных.
5.2.3. Отслеживание совокупного объема данных, перемещенных с помощью операций ввода/вывода
В данном разделе описывается способ отслеживания совокупного объема данных, перемещенных с помощью операций ввода/вывода в рамках системы.
traceio.stp
Сценарий traceio.stp выводит информацию о первых десяти процессах, наиболее интенсивно перемещающих данные с помощью операций ввода/вывода с течением времени. В дополнение он также позволяет отслеживать совокупный объем данных, прочитанных и записанных этими десятью процессами с помощью операций ввода/вывода. Вся эта информация обрабатывается и выводится с интервалом в 1 секунду, при этом информация о процессах сортируется в соответствии с убыванием объема перемещенных данных.
Обратите внимание на то, что в сценарии traceio.stp используется локальная переменная $return
, которая также используется в сценарии disktop.stp из Раздела 5.2.1, "Подсчет объема данных при чтении данных с диска/записи данных на диск".
Пример 5.8. Вариант вывода сценария traceio.stp
5.2.4. Мониторинг операций ввода/вывода (для устройства)
В данном разделе описывается способ мониторинга операций ввода/вывода для определенного устройства.
traceio2.stp
Сценарий traceio2.stp принимает 1 аргумент: номер самого устройства. Для получения этого номера используйте команду stat -c "0x%D" директория
, где вместо строки директория
должен использоваться путь к директории, расположенной на устройстве для мониторинга операций ввода/вывода.
Функция usrdev2kerndev()
преобразует номер устройства в формат, с которым работает ядро ОС. Возвращаемое функцией usrdev2kerndev()
значение используется вместе с функциями MKDEV()
, MINOR()
и MAJOR()
для получения основного и дополнительного номеров определенного устройства.
Вывод сценария traceio2.stp содержит имена и идентификаторы каждого из процессов, осуществляющих чтение/запись, имя функции, в рамках которой выполнялась операция (а именно, vfs_read
или vfs_write
), а также номер устройства в рамках ядра ОС.
В следующем примере приведен фрагмент вывода сценария, запущенного с помощью команды stap traceio2.stp 0x805
, где число 0x805
является номером устройства, на котором расположена директория /home
. Директория /home
расположена на устройстве /dev/sda5
, следовательно, мы будем осуществлять мониторинг именно этого устройства.
[...] synergyc(3722) vfs_read 0x800005 synergyc(3722) vfs_read 0x800005 cupsd(2889) vfs_write 0x800005 cupsd(2889) vfs_write 0x800005 cupsd(2889) vfs_write 0x800005 [...]
5.2.5. Мониторинг операций чтения данных из файла и записи данных в файл
В данном разделе описывается способ мониторинга операций чтения данных из файла и записи данных в файл в реальном времени.
#! /usr/bin/env stap probe vfs.write, vfs.read { # переменные dev и ino объявлены в рамках событий vfs.write и vfs.read if (dev == MKDEV($1,$2) # основной/дополнительный номер устройства && ino == $3) printf ("%s(%d) %s 0x%x/%u\n", execname(), pid(), ppfunc(), dev, ino) }
- Основной номер устройства, на котором находится файл.
- Дополнительный номер устройства, на котором находится файл.
- Номер
inode
файла.
Для получения данной информации следует использовать команду stat -c '%D %i' имя_файла
, где вместо строки имя_файла
должен использоваться абсолютный путь к файлу.
/etc/crontab
в первую очередь следует выполнить команду stat -c '%D %i' /etc/crontab
. В результате будет получен следующий вывод:
805 1078319
Число 805
является номером устройства (в шестнадцатеричном формате). Две цифры, соответствующие низшим разрядам, представляют дополнительный номер устройства, а цифры, соответствующие высшим разрядам - основной номер устройства. Значение 1078319
является номером inode
файла. Для начала мониторинга операций в отношении файла /etc/crontab
следует выполнить команду stap inodewatch.stp 0x8 0x05 1078319
(префикс 0x
используется для указания на шестнадцатеричные значения).
Вывод данного сценария содержит имя и идентификатор любого процесса, который осуществляет операции чтения/записи заданного файла, имя функции, в рамках которой они осуществляются (а именно, vfs_read
или vfs_write
), номер устройства (в шестнадцатеричном формате), а также номер inode
. Пример 5.10, "Вариант вывода сценария inodewatch.stp" содержит вывод сценария, запущенного с помощью команды stap inodewatch.stp 0x8 0x05 1078319
(при исполнении команды cat /etc/crontab
в процессе работы сценария):
cat(16437) vfs_read 0x800005/1078319 cat(16437) vfs_read 0x800005/1078319
5.2.6. Мониторинг изменений атрибутов файлов
В данном разделе описывается способ мониторинга изменений атрибутов целевого файла средствами любых процессов в реальном времени.
inodewatch2.stp
Как и сценарий inodewatch.stp из Раздела 5.2.5, "Мониторинг операций чтения данных из файла и записи данных в файл", сценарий inodewatch2.stp принимает номер устройства, на котором расположен целевой файл (в целочисленном формате) и номер inode
в качестве аргументов. Для ознакомления с дополнительной информацией о способе получения упомянутых данных, обратитесь к Разделу 5.2.5, "Мониторинг операций чтения данных из файла и записи данных в файл".
Вывод сценария inodewatch2.stp аналогичен выводу сценария inodewatch.stp за исключением того, что сценарий inodewatch2.stp также выводит информацию о изменении атрибутов целевого файла вместе с идентификатором осуществившего это изменение пользователя (uid()
). В Примере 5.11, "Вариант вывода сценария inodewatch2.stp" показан вывод сценария inodewatch2.stp в момент, когда в процессе мониторинга изменений атрибутов файла /home/joe/bigfile
пользователь joe
выполняет команды chmod 777 /home/joe/bigfile
и chmod 666 /home/joe/bigfile
.
chmod(17448) inode_setattr 0x800005/6011835 100777 500 chmod(17449) inode_setattr 0x800005/6011835 100666 500
5.2.7. Периодический вывод времени блокировки ввода-вывода
В данном разделе описывается способ отслеживания времени, необходимого для завершения каждой операции ввода/вывода с блокировкой. Данное исследование полезно для выявления наличия чрезмерного количества ресурсоемких операций ввода/вывода в заданный момент времени.
ioblktime.stp
Сценарий ioblktime.stp рассчитывает среднее время ожидания операции ввода/вывода с блокировкой для устройства и выводит полученную информацию через каждые 10 секунд. Как обычно, вы можете изменить эту частоту вывода информации, отредактировав значение, заданное в строке probe timer.s(10), end {
.
В некоторых случаях может осуществляться большое количество ресурсоемких операций ввода/вывода с блокировками, что в конце концов приведет к превышению стандартного для сценария значения MAXMAPENTRIES
. Значение MAXMAPENTRIES
устанавливает максимальное количество элементов массива, если размер массива явно не указывался при объявлении. В том случае, если превышается стандартное значение MAXMAPENTRIES
, равное 2048, снова запустите сценарий, используя параметр -DMAXMAPENTRIES=10000
утилиты stap
.
устройство rw всего (мс) количество среднее (мс) sda W 9659 6 1609 dm-0 W 20278 6 3379 dm-0 R 20524 5 4104 sda R 19277 5 3855
В выводе из Примера 5.12, "Вариант вывода сценария ioblktime.stp" отражены имя устройства, выполненные операции (rw
), общее время выполнения всех операций (всего (мс)
), количество операций (количество
), а также среднее время ожидания для всех этих операций (среднее (мс)
). Значения времени, рассчитанные с помощью сценария, выводятся в микросекундах.
Следующий раздел : 5.3. Профилирование.