Перейти к основному содержанию

Мониторим дисковую подсистему в Linux

HDD storage

Полезные утилиты в копилку системного администратора для траблшутинга проблем дисковой подсистемы. Если дисковая подсистема не справляется, это может привести к проблемам самих сервисов, работающих на данном сервере.

Если сервер аппаратный, там проблема может быть более явной. На виртуальной машине проблема может ничем не проявляться кроме тормозов в работе сервисов.

Работаю сегодня на Ubuntu 20.04.6 LTS. Расскажем про iostat и iotop.

Для чего мониторить дисковую подсистему?

Для системного администратора или DevOps-инженера мониторинг ввода-вывода (I/O) — это базовый навык. Работать без него — всё равно что пытаться починить сложный механизм в полной темноте. Утилиты мониторинга дисковой подсистемы — ваш основной и незаменимый инструмент: они дают быстрый, простой и наглядный снимок текущей ситуации с дисками.

Выявление узких мест производительности

Часто причина зависаний кроется не в процессоре или оперативной памяти, а в чрезмерной нагрузке на дисковую подсистему (много операций чтения/записи).

Обнаружение скрытых потребителей

Бывают ситуации, когда фоновый процесс, служба или контейнер начинают активно записывать логи, генерировать временные файлы или кэшировать данные, и эта активность не всегда очевидна в стандартных мониторах вроде top или htop.

Обоснование модернизации и настройки

Анализ того, какие именно задачи нагружают диски, даёт чёткое понимание для принятия решений: нужен ли переход на SSD, требуется ли настройка RAID-массива или достаточно оптимизировать работу приложений.

iostat

Утилиту iostat можно использовать для оптимизации работы системы.  

iostat — утилита командной строки в Linux, которая с собирает и показывает статистику по CPU и дисковому вводу-выводу (I/O).

Утилита можно не входить в базовый набор пакетов, но её можно установить с пакетом sysstat:

apt install sysstat

Использовать просто.

iostat
linux

Команда iostat формирует два типа отчётов: отчёт об использовании CPU и отчёт об использовании устройств. 

Первый отчёт, генерируемый командой iostat, — это отчёт об использовании CPU. Для многопроцессорных систем значения CPU представляют собой глобальные средние значения по всем процессорам. Отчёт имеет следующий формат:

  • %user
    Показывает процент использования CPU при выполнении задач на уровне пользователя (приложения).
  • %nice
    Показывает процент использования CPU при выполнении задач на уровне пользователя с приоритетом nice.
  • %system
    Показывает процент использования CPU при выполнении задач на системном уровне (ядро).
  • %iowait
    Показывает процент времени, в течение которого CPU или CPUs простаивали, в то время как в системе имелся необработанный запрос дискового ввода-вывода.
  • %steal
    Показывает процент времени, который виртуальный CPU или CPUs провели в вынужденном ожидании, пока гипервизор обслуживал другой виртуальный процессор.
  • %idle
    Показывает процент времени, в течение которого CPU или CPUs простаивали, и в системе не было необработанных запросов дискового ввода-вывода.

Второй отчёт, генерируемый командой iostat, — это отчёт об использовании устройств. Этот отчёт предоставляет статистику для каждого физического устройства или раздела. Блочные устройства и разделы, для которых должна отображаться статистика, могут быть указаны в командной строке. Если ни устройство, ни раздел не указаны, то статистика отображается для каждого устройства, используемого системой, при условии, что ядро ведёт для него статистику. Если в командной строке указано ключевое слово ALL, то статистика отображается для всех устройств, определённых в системе, включая те, которые никогда не использовались. По умолчанию скорости передачи данных показаны в блоках по 1 КБ, если только не установлена переменная окружения POSIXLY_CORRECT, в этом случае используются блоки по 512 байт. В отчёте могут отображаться следующие поля в зависимости от использованных флагов:

  • Device:
    В этой колонке указано имя устройства (или раздела), как оно перечислено в каталоге /dev.
  • tps
    Указывает количество операций передачи данных в секунду, отправленных на устройство. Передача — это запрос ввода-вывода к устройству. Несколько логических запросов могут быть объединены в один запрос ввода-вывода к устройству. Размер передачи не определён.
  • Blk_read/s (kB_read/s, MB_read/s)
    Указывает объём данных, считанных с устройства, выраженный в количестве блоков (килобайт, мегабайт) в секунду. Блоки эквивалентны секторам и, следовательно, имеют размер 512 байт.
  • Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s)
    Указывает объём данных, записанных на устройство, выраженный в количестве блоков (килобайт, мегабайт) в секунду.
  • Blk_dscd/s (kB_dscd/s, MB_dscd/s)
    Указывает объём данных, отброшенных (discarded) для устройства, выраженный в количестве блоков (килобайт, мегабайт) в секунду.
  • Blk_read (kB_read, MB_read)
    Общее количество считанных блоков (килобайт, мегабайт).
  • Blk_wrtn (kB_wrtn, MB_wrtn)
    Общее количество записанных блоков (килобайт, мегабайт).
  • Blk_dscd (kB_dscd, MB_dscd)
    Общее количество отброшенных блоков (килобайт, мегабайт).
  • r/s
    Количество (после объединения) успешно выполненных запросов на чтение в секунду для устройства.
  • w/s
    Количество (после объединения) успешно выполненных запросов на запись в секунду для устройства.
  • d/s
    Количество (после объединения) успешно выполненных запросов на отбрасывание (discard) в секунду для устройства.
  • sec/s (kB/s, MB/s)
    Количество секторов (килобайт, мегабайт), считанных с устройства, записанных на него или отброшенных для него в секунду.
  • rsec/s (rkB/s, rMB/s)
    Количество секторов (килобайт, мегабайт), считанных с устройства в секунду.
  • wsec/s (wkB/s, wMB/s)
    Количество секторов (килобайт, мегабайт), записанных на устройство в секунду.
  • dsec/s (dkB/s, dMB/s)
    Количество секторов (килобайт, мегабайт), отброшенных для устройства в секунду.
  • rqm/s
    Количество запросов ввода-вывода, объединённых в секунду и поставленных в очередь к устройству.
  • rrqm/s
    Количество запросов на чтение, объединённых в секунду и поставленных в очередь к устройству.
  • wrqm/s
    Количество запросов на запись, объединённых в секунду и поставленных в очередь к устройству.
  • drqm/s
    Количество запросов на отбрасывание (discard), объединённых в секунду и поставленных в очередь к устройству.
  • %rrqm
    Процент запросов на чтение, объединённых вместе перед отправкой на устройство.
  • %wrqm
    Процент запросов на запись, объединённых вместе перед отправкой на устройство.
  • %drqm
    Процент запросов на отбрасывание (discard), объединённых вместе перед отправкой на устройство.
  • areq-sz
    Средний размер (в килобайтах) запросов ввода-вывода, отправленных на устройство.
    Примечание: В предыдущих версиях это поле называлось avgrq-sz и выражалось в секторах.
  • rareq-sz
    Средний размер (в килобайтах) запросов на чтение, отправленных на устройство.
  • wareq-sz
    Средний размер (в килобайтах) запросов на запись, отправленных на устройство.
  • dareq-sz
    Средний размер (в килобайтах) запросов на отбрасывание (discard), отправленных на устройство.
  • await
    Среднее время (в миллисекундах), затраченное на обслуживание запросов ввода-вывода, отправленных на устройство. Включает время нахождения запросов в очереди и время их непосредственного выполнения.
  • r_await
    Среднее время (в миллисекундах), затраченное на обслуживание запросов на чтение, отправленных на устройство. Включает время нахождения запросов в очереди и время их непосредственного выполнения.
  • w_await
    Среднее время (в миллисекундах), затраченное на обслуживание запросов на запись, отправленных на устройство. Включает время нахождения запросов в очереди и время их непосредственного выполнения.
  • d_await
    Среднее время (в миллисекундах), затраченное на обслуживание запросов на отбрасывание (discard), отправленных на устройство. Включает время нахождения запросов в очереди и время их непосредственного выполнения.
  • qu-sz
    Средняя длина очереди запросов, отправленных на устройство.
    Примечание: В предыдущих версиях это поле называлось avgqu-sz.
  • %util
    Процент времени, в течение которого на устройство отправлялись запросы ввода-вывода (загрузка пропускной способности устройства). Насыщение устройства наступает, когда это значение близко к 100% для устройств, обслуживающих запросы последовательно. Однако для устройств, обслуживающих запросы параллельно (таких как RAID-массивы и современные SSD), это число не отражает их реальных пределов производительности.

Отчёт по умолчанию показывает не всё, изучите мануал.

man iostat

Опции iostat

  • -c
    Отобразить отчёт об использовании CPU.
  • -d
    Отобразить отчёт об использовании устройств.
  • --dec={ 0 | 1 | 2 }
    Указать количество знаков после десятичной точки для отображения (от 0 до 2, значение по умолчанию — 2).
  • -g имя_группы { устройство [...] | ALL }
    Отобразить статистику для группы устройств. Команда iostat выводит статистику для каждого отдельного устройства в списке, а затем строку с общей статистикой для группы, которая отображается под именем имя_группы и состоит из всех устройств в списке. Ключевое слово ALL означает, что в группу должны быть включены все блочные устройства, определённые системой.
  • -H
    Эта опция должна использоваться вместе с опцией -g и указывает, что должны отображаться только общие статистические данные по группе, а не статистика для отдельных устройств в группе.
  • -h
    Сделать отчёт об использовании устройств более удобочитаемым для человека. С этой опцией неявно активируется --human.
  • --human
    Выводить размеры в удобочитаемом для человека формате (например, 1.0k, 1.2M и т.д.). Единицы измерения, отображаемые с этой опцией, заменяют любые другие единицы по умолчанию (например, килобайты, секторы...), связанные с метриками.
  • -j { ID | LABEL | PATH | UUID | ... } [ устройство [...] | ALL ]
    Отображать постоянные имена устройств. Опции ID, LABEL и т.д. определяют тип постоянного имени. Эти опции не ограничены, единственное условие — наличие в системе каталога /dev/disk с требуемыми постоянными именами. Дополнительно можно указать несколько устройств в выбранном типе постоянного имени. Поскольку постоянные имена устройств обычно длинные, опция...
  • -k
    Отображать статистику в килобайтах в секунду.
  • -m
    Отображать статистику в мегабайтах в секунду.
  • -N
    Отображать зарегистрированные имена Device Mapper для любых устройств Device Mapper. Полезно для просмотра статистики LVM2.
  • -o JSON
    Отображать статистику в формате JSON (JavaScript Object Notation). Порядок полей в выводе JSON не определён, и в будущем могут быть добавлены новые поля.
  • -p [ { устройство [,...] | ALL } ]
    Опция -p отображает статистику для блочных устройств и всех их разделов, используемых системой. Если имя устройства указано в командной строке, отображается статистика для него и всех его разделов. Наконец, ключевое слово ALL указывает, что статистика должна быть отображена для всех блочных устройств и разделов, определённых системой, включая те, которые никогда не использовались. Если перед этой опцией задана опция -j, устройства в командной строке могут быть указаны с помощью выбранного типа постоянного имени.
  • -s
    Отобразить короткую (узкую) версию отчёта, которая должна помещаться на экранах шириной 80 символов.
  • -t
    Выводить время для каждого отображаемого отчёта. Формат времени может зависеть от значения переменной окружения S_TIME_FORMAT (см. ниже).
  • -V
    Вывести номер версии.
  • -x
    Отобразить расширенную статистику.
  • -y
    Пропустить первый отчёт со статистикой с момента загрузки системы, если отображается несколько записей с заданным интервалом.
  • -z
    Указать iostat пропускать вывод для любых устройств, на которых не было активности в течение периода сбора данных.

Бывает что нагрузка на дисковую систему непостоянная, в динамике можно смотреть с помощью watch;

watch iostat -x

watch — утилита в операционной системе Unix, которая запускает определённую программу через фиксированный интервал времени и отображает вывод этой программы в окне терминала.

iotop

Утилита iotop не вмешивается в работу процессов, не тормозит систему и почти не потребляет ресурсы. Всё, что он делает — читает статистику и красиво её выводит. iotop использует интерфейсы ядра (procfs, sysfs и taskstats), чтобы вытащить статистику по каждому процессу.

Утилита можно не входить в базовый набор пакетов, но её можно установить с пакетом iotop:

apt install iotop

Iotop — утилита командной строки в Linux, которая мониторит использование дискового ввода-вывода (I/O) в режиме реального времени.

Использовать просто.

iotop
linux

Утилита похожа на top, но фокусируется именно на I/O (Input/Output) — чтение и запись на диск.

Внизу экрана можно найти некоторые команды, которые можно вызвать нажатиями на клавиши клавиатуры. Например, o скрывает (или отображает) все неактивные процессы. Это позволяет уменьшить большой объём сведений.

Что можно увидеть?

  • Total DISK READ / DISK WRITE — общая статистика по вводу выводу
  • Curent DISK READ / DISK WRITE — текущая статистика обращения к дискам, не учитывается cache и buffur, не учитываются операции ввода вывода внутри ядра
  • TID — номер потока
  • PRIO — приоритет
  • USER — от какого пользователя запущен процесс
  • DISK READ/WRITE — скорость чтения/записи (в KB/s или MB/s)
  • SWAPIN — процент времени, когда процесс перемещает данные между RAM и swap
  • IO — процент времени, когда процесс ждёт завершения I/O
  • COMMAND — команда, которой запущен процесс

Что ещё?

Для мониторинга дисковой подсистемы могут пригодиться:

  • dstat — Универсальный инструмент для мониторинга различных системных ресурсов, включая дисковый ввод-вывод. Позволяет получить полный обзор производительности системы в режиме реального времени. 
  • atop —  Утилита мониторинга системы для Linux, которая отображает загрузку системных ресурсов в реальном времени. Она не только показывает текущие данные, но и сохраняет исторические для анализа.
  • sar — утилита в Linux, которая собирает, отображает и сохраняет информацию о деятельности системы. Она помогает администраторам систем анализировать производительность, выявлять узкие места и оптимизировать распределение ресурсов. Входит в sysstat.
  • glances — Консольный инструмент мониторинга на Python. Отображает данные о различных системных ресурсах в режиме реального времени.
  • pidstat — Утилита, используемая для мониторинга и отчётности по статистике производительности процессов. Она может контролировать либо конкретный процесс, либо все запущенные процессы в системе. Входит в sysstat.
  • btrace — Запускает трассировку драйвера блочного устройства в ядре и возвращает данные трассировки.
  • iosnoop — Утилита для анализа событий ввода-вывода (I/O) на блочных устройствах в Linux. Умеет показывать latency.
  • biosnoop, biotop, bitesize, blktrace, collectl, vmstat, nmon, iolatency, ext4slower...

Теги

 

Похожие материалы

mdadm — расширяем программный RAID10 массив в HPE Proliant DL380 Gen10

Всех приветствую. Сегодня мы решаем понятную задачу по расширению программного дискового массива в сервере HPE Proliant DL380 Gen10.

Теги