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

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

Что еще почитать по теме

T-Rex 30 марта 2021

Что такое SMTP-протокол и как он устроен?

SMTP (Simple Mail Transfer Protocol) — протокол передачи почты. Он был представлен еще в 1982 году, но не теряет актуальности до сих пор. В статье разбираемся, какие задачи решает протокол и как он ра…
T-Rex 30 марта 2021
Владимир Туров 1 сентября 2020

Дело совершенно секретного iPod

Это был обычный серый день в конце 2005 года. Я сидел на рабочем месте и писал код для следующей версии iPod. Вдруг без стука ворвался директор ПО для iPod, начальник моего начальника, и закрыл дверь.
Владимир Туров 1 сентября 2020
T-Rex 21 августа 2020

TrendForce: цены на SSD упадут

Эксперты DRAMeXchange предсказывают значительное падение цен на оперативную память и твердотельные накопители в ближайшее время. Причина — сокращение спроса на чипы для NAND и DRAM.
T-Rex 21 августа 2020

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022
T-Rex 28 сентября 2022

Книги по SQL: что почитать новичкам и специалистам

Собрали 6 книг, которые помогут на старте изучения SQL и при углублении в тему.
T-Rex 28 сентября 2022