company_banner

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

    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, 354 KiB         
    Read Dispatches:     0 0KiB             Write Dispatches: 33, 276 KiB
    Reads Requeued:      0                     Writes Requeued: 0
    Reads Completed:     0,0KiB           Writes Completed: 0,0 KiB          
    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; обработанный результат сохраним в отдельном файле:
    blkparse -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 для анализа обращений к дискам, осуществляемых приложениями для работы с базами данных.

    Для тех кто не может комментировать посты на Хабре, приглашаем к нам в блог.
    Selectel
    ИТ-инфраструктура для бизнеса

    Похожие публикации

    Комментарии 5

      +2
      Спасибо, а можете привести пару прикладных кейсов где пришлось использовать blktrace?
      Имею ввиду в вашей компании.
        +2
        еще добавлю чего сам знаю
        F — операция объединена со смежной операцией в очереди; (front merge бывает в очень специфичных workloads, — объединяет запросы в начале очереди, deadline elevator позволяет отключать такое слияние)
        M — операция объединена со смежной операцией в очереди; (back merge встречается гораздо чаще — объединение запросов в конце очереди)
          0
          Спасибо за дополнения!
        0
        >Например, с помощью iostat нельзя узнать, какой именно процесс совершает ту или иную операцию.
        iotop?
          0
          Не совсем понял с первым примером (blktrace -w 30 -d /dev/sdf -o-). Как на выходе получаются такие данные? У меня при таком запуске в консоль вываливается бинарный output.
          Есть 2 версии: либо изменилось что-то в новых версиях утилиты, либо какая-то ошибка в статье. Склоняюсь ко второму варианту, т. к. если тот выход, что показан, записать в файл, то из него невозможно потом восстановить что-то более подробное, как показано дальше в статье (blkparse -i trace -d trace1)

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое