Операции ввода-вывода, как известно, принадлежат к числу критических ресурсов с точки зрения производительности в современных linux-системах. Выявление и анализ «узких мест» производительности в Linux-системах — дело достаточно сложное. Обычно для этой цели используются специализированные утилиты. В числе наиболее известных инструментов анализа производительности следует в первую очередь назвать утилиты, входящие в пакет sysstat (iostat, sar и т.п.). Однако в некоторых ситуациях информации получаемой с помощью этих утилит, бывает недостаточно. Например, с помощью iostat нельзя узнать, какой именно процесс совершает ту или иную операцию. Между тем такая информация бывает необходимой при решении некоторых специфических задач: например, для поиска и анализа «узких мест» в системах хранения данных.
Известный разработчик ядра Linux Йенс Аксбо в 2007 году создал blktrace — специальную утилиту, осуществляющую трассировку операций ввода-вывода и предоставляющую пользователю подробную информацию о них. В этой статье мы хотели бы подробно рассказать о возможностях blktrace.
Возможности
C помощью blktrace можно решать следующие задачи:
- анализировать производительность блочных устройств;
- рассчитывать потенциальные затраты ресурсов (например, при подключении программного RAID);
- анализировать производительность различных аппаратных конфигураций;
- определять оптимальную конфигурацию для конкретного программного окружения;
- оценивать производительность различных файловых систем: разные файловые системы (ext4, JFS, XFS, Btrfs) по-разному взаимодействуют с подсистемой блочного ввода-вывода, и с помощью blktrace можно определить, какая файловая система сможет обеспечить наилучшую производительность при работе с определенным приложением или аппаратной конфигурацией.
Установка и начало работы
Blktrace доступна в большинстве распространенных Linux-дистрибутивов, поэтому для ее установки не нужно ничего собирать из исходников. Установка осуществляется стандартным способом с помощью пакетного менеджера. Вместе с blktrace устанавливается также вспомогательная утилита blkparse, представляющая выводы в более удобной, человекочитаемой форме.
Теперь выполним такую команду:
blktrace -w 30 -d /dev/sdf -o-
Аргументы командной строки в данном случае означают следующее:
- «w» означает период времени, в течение которого будет осуществляться наблюдение (в данном случае это 30 секунд);
- после аргумента «d» указывается устройство, для которого будет собрана статистика об операциях ввода-вывода;
- «-о-» представляет собой указание, что вся статистика будет выведена на консоль, а не сохранена в специальном текстовом файле.
Более подробно об аргументах командной строки и синтаксисе команд можно прочитать в официальной документации.
На экране появится следующая таблица:
=== sdd === CPU 0: 34 events, 2 KiB data CPU 1: 27 events, 2 KiB data CPU 2: 41 events, 2 KiB data CPU 3: 46 events, 3 KiB data CPU 4: 2769 events, 130 KiB data CPU 5: 1718 events, 81 KiB data CPU 6: 1326 events, 63 KiB data CPU 7: 2279 events, 107 KiB data CPU 8: 14 events, 1 KiB data CPU 9: 12 events, 1 KiB data CPU 10: 22 events, 2 KiB data CPU 11: 50 events, 3 KiB data CPU 12: 455 events, 22 KiB data CPU 13: 184 events, 9 KiB data CPU 14: 508 events, 24 KiB data CPU 15: 1100 events, 52 KiB data Total: 10585 events (dropped 0), 497 KiB data
В ней отображается информация о загрузке процессорных ядер, имеющая небольшую практическую ценность: на ее основе нельзя сделать никаких выводов о производительности операций ввода-вывода.
Чтобы получить более подробную информацию, представленную в понятной форме, прибегнем к помощи утилиты blkparse:
blktrace -w 1 -d /dev/sdf -o - | blkparse -i -
Теперь вывод будет выглядеть так:
8,32 0 19190 28.774795629 2039 D R 94229760 + 32 [fio] 8,32 0 19191 29.927624071 0 C R 94229760 + 32 [0]
/далее отображается статистка по операциям ввода-вывода для всех задействованных процессорных ядер; мы приведем пример такой статистики для одного ядра/
CPU15 (8,32): Reads Queued: 0, 0KiB Writes Queued: 64, 354KiB Read Dispatches: 0, 0KiB Write Dispatches: 33, 276KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB Read Merges: 0, 0KiB Write Merges: 0, 0KiB Read depth: 0 Write depth: 68 IO unplugs: 22 Timer unplugs: 16 Total (8,32): Reads Queued: 0, 0KiB Writes Queued: 1908, 7665KiB Read Dispatches: 0, 0KiB Write Dispatches: 1009, 7665KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 0, 0KiB Writes Completed: 1954, 7655KiB Read Merges: 0, 0KiB Write Merges: 0, 0KiB IO unplugs: 612 Timer unplugs: 382 Throughput (R/W): 0KiB/s / 7701KiB/s Events (8,32): 11684 entries Skips: 0 forward (0 - 0.0%)
В начале идет таблица, состоящая из следующих колонок:
- мажорный и минорный номера устройства (в нашем случае 8, 32);
- ядро, задействованное при выполнении операции;
- порядковый номер операции;
- время выполнения операции (в миллисекундах);
- идентификатор процесса (PID);
- событие (blktrace отслеживает события жизненного цикла всех операций ввода-вывода, в том числе и свои собственные);
- RWBS (R —чтение, W — запись, B — барьерная операция, S — синхронная операция);
- блок, с которого началось выполнение операции+число блоков;
- имя процесса, выполнившего операцию (указывается в квадратных скобках).
Основные операции обозначаются так:
- A — операция ввода-вывода была передана другому устройству;
- C — операция завершена;
- F — операция объединена со смежной операцией в очереди;
- I — запрос на выполнение операции поставлен в очередь;
- M — операция объединена со смежной операцией в очереди;
- Q — операция поставлена в очередь;
- T — отключено по причине таймаута;
- X — операция разбита на несколько операций.
Далее blkparse выводит cуммарную информацию обо всех операциях ввода-вывода и сравнивает уровень загруженности операций чтения и операций записи.
Вспомогательные инструменты
Blktrace получает данные и представляет их в человекочитаемой форме, но не анализирует их. Для анализа этих данных и построения графиков на их основе предназначены специализированные утилиты — здесь в первую очередь следует назвать btt и seekwatcher/iowatcher.
Btt
Название этой утилиты представляет собой аббревиатуру выражения blktrace timeline, что можно перевести как «хроника blktrace». Она предназначена для анализа файлов, в которых сохранены выводы blktrace, обработанные blkparse, извлекая из них информацию:
- о времени, затраченном на обработку операции перед ее постановкой в очередь;
- о времени, затраченном на ожидание в очереди;
- о времени, затраченном непосредственно на выполнение операции.
Чтобы получить отчет btt, нужно сначала выполнить трассировку операций ввода-вывода с помощью blktrace и сохранить ее в отдельном файле:
blktrace -d /dev/sda -o- > trace
Теперь обработаем этот файл с помощью blkparse; обработанный результат сохраним в отдельном файле:
blkparce -i trace -d trace1
(аргумент -d в данном случае указывает на файл, в который будут сохранены обработанные данные).
Теперь обработаем полученный вывод с помощью btt, выполнив следующую команду:
btt -i trace1
На экран будет выведен отчет, представленный в виде таблицы. Более подробно о структуре выводов btt и их интерпретации можно прочитать в официальной документации.
Seekwatcher/Iowatcher
Утилита seekwatcher была создана в 2007 Крисом Мэйсоном. Она была предназначена для обработки отчетов blktrace и построения графиков, в том числе и анимированных. Сайт проекта seekwatcher существует и до сих пор, но имеет скорее мемориальных характер.
Сегодня Крис Мэйсон разрабатывает новый инструмент для визуализации данных blktrace — iowatcher. Установить iowatcher можно из репозитория. iowatcher требует минимум зависимостей: чтобы создавать анимированные графики, необходимо только установить программы ffmpeg или librsvg.
С помощью iowatcher можно строить графики (в том числе и анимированные) на основе выводов blktrace, а также утилит btt, fio и mstat.
Чтобы построить график, необходимо сначала запустить blktrace и сохранить вывод в текстовый файл:
blktrace -w 30 -d /dev/sdf -o- > trace.dump
Затем вводим следующую команду:
iowatcher -t trace.dump -o trace.svg
iowatcher представит данные blktrace в виде графика.
Анимированный график можно получить при помощи команды:
iowatcher -t trace.dump --movie -o trace.mp4/
Более подробно о синтаксисе команд можно почитать здесь.
Где используется blktrace
Blktrace используется в качестве вспомогательного инструмента в программных решениях, предназначенных для анализа и диагностики проблем производительности в системах хранения данных.
Например, компания LSI выпускает несколько моделей SSD-дисков, выполненных в виде PCI-экспресс карт. Чтобы помочь пользователю выбрать наиболее оптимальную модель, компания разработала специальный программный продукт — Nytro Predictor. Nytro Predictor собирает информацию об активности использования хранилищ приложениями и формулирует на их основе рекомендации по улучшению времени отклика. В качестве инструмента сбора данных в Linux-системах используется blktrace. Затем эти данные обрабатываются при помощи специальных алгоритмов, после чего осуществляется подбор аппаратного решения, позволяющего обеспечить оптимальную скорость.
Компания Intel выпускает аналогичный продукт, в котором используются программные компоненты от LSI – Intel RAID SSD Cache Sizing and Performance Prediction Tool. В качестве инструмента сбора статистики в нем также используется blktrace.
Проблема ускорения доступа к данным и уменьшения времени отклика очень актуальна для социальных сетей с большим количеством пользователей. Активную работу по решению этой проблемы ведут программисты Facebook, которые в 2010 году создали Flashcache — модуль для ядра Linux, позволяющий использовать одни блочные устройства для кэширования доступа к другим блочным устройствами. Продукт распространяется по лицензии GPL (вот репозиторий на GitHub). Разработчики Flashcache использовали blktrace для анализа обращений к дискам, осуществляемых приложениями для работы с базами данных.
Для тех кто не может комментировать посты на Хабре, приглашаем к нам в блог.
Автор: AndreiYemelianov