Анализ производительности блочных устройств с blktrace

в 11:08, , рубрики: selectel, Блог компании Селектел, диагностика производительности, селектел, системное администрирование, метки: , ,

blktrace

Операции ввода-вывода, как известно, принадлежат к числу критических ресурсов с точки зрения производительности в современных 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%)

В начале идет таблица, состоящая из следующих колонок:

  1. мажорный и минорный номера устройства (в нашем случае 8, 32);
  2. ядро, задействованное при выполнении операции;
  3. порядковый номер операции;
  4. время выполнения операции (в миллисекундах);
  5. идентификатор процесса (PID);
  6. событие (blktrace отслеживает события жизненного цикла всех операций ввода-вывода, в том числе и свои собственные);
  7. RWBS (R —чтение, W — запись, B — барьерная операция, S — синхронная операция);
  8. блок, с которого началось выполнение операции+число блоков;
  9. имя процесса, выполнившего операцию (указывается в квадратных скобках).

Основные операции обозначаются так:

  • 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

Источник

Поделиться

* - обязательные к заполнению поля