Анализ дисковой активности
Проверка нагрузки на диск
Несколько утилит для проверки нагрузки на диск в Linux:
smartctl
btrace. Анализирует дисковую активность процессов и потоков ядра, в конце показывает сводную статистику.
iostat. Выводит статистику по дисковым устройствам в режиме реального времени.
iotop. Позволяет в режиме реального времени посмотреть нагрузку на диск отдельных приложений.
atop. Даёт сведения о том, как процессы пользуются дисками, и предоставляет некоторые сводные сведения.
iosnoop. Утилита из пакета perf-tools показывает много полезной информации, в том числе latency.
biosnoop. Утилита из пакета BPF Tools показывает активность процессов, в том числе используемые сектора дисков и latency
Если устройство поддерживает S.M.A.R.T. (SSD, EMMC, некоторые промышленные MicroSD), то первым делом следует запросить данные с накопителя программами smartctl, skdump или mmc
sudo smartctl -a /dev/sda
iotop
iotop отслеживает информацию об использовании ввода-вывода, выводимую ядром Linux и отображает таблицу текущего использования ввода-вывода процессами или потоками в системе
С помощью iotop можно определить какие процессы генерируют наибольшее количество дисковых операций ввода-вывода, отследить скорость чтения и записи
iotop отображает столбцы для полосы пропускания ввода-вывода, считываемой и записываемой каждым процессом/потоком в течение периода выборки
Он также отображает процент времени, затраченного потоком/процессом на замену и ожидание ввода-вывода. Для каждого процесса отображается его приоритет ввода-вывода (класс/уровень)
В верхней части интерфейса отображается общая пропускная способность ввода-вывода, считываемая и записываемая в течение периода выборки
TID указывает идентификатор потока, а PID - идентификатор процесса
PRIO - это приоритет ввода-вывода, с которым выполняется поток
USER - владелец процесса
SWAPIN — процент времени потраченный на помещение данных в подкачку
IO — процент времени ожидания ввода вывода.
DISK READ / DISK WRITE — блоков считывается / записывается в секунду.
Total DISK READ / DISK WRITE — общая статистика по вводу выводу за каждую секунду, между процессами и потоками ядра с одной стороны и подсистемой блочных устройств ядра — с другой
Curent DISK READ / DISK WRITE — текущая статистика обращения к дискам, не учитывается cache и buffur, не учитываются операции ввода вывода внутри ядра.
Общее и фактическое значения могут не совпадать в любой момент времени из-за кэширования данных и изменения порядка операций ввода-вывода, которые происходят внутри ядра Linux
Стрелки влево и вправо используются, чтобы изменить сортировку, r - для изменения порядка сортировки в обратном порядке, o - для переключения параметра --only, p - для переключения параметра --processes, a - для переключения параметра --accumulated , q - для завершения или i - для изменения приоритета потока или цепочки процессов(s). Любая другая клавиша вызовет принудительное обновление.
-o, --only - Отображать только процессы или потоки, фактически выполняющие ввод-вывод, вместо отображения всех процессов или потоков
-b, --batch - Включает неинтерактивный режим
-n NUM, --iter=NUM - Установите количество повторений перед завершением работы
-d SEC, --delay=SEC - Установите задержку между итерациями в секундах (по умолчанию 1 секунда)
-p PID, --pid=PID - Список процессов/потоков для мониторинга
-u USER, --user=USER - Список пользователей для мониторинга (все по умолчанию)
-P, --processes - Показывать только процессы. Обычно iotop показывает все потоки.
-a, --accumulated - Отображать накопленный ввод-вывод вместо пропускной способности. В этом режиме iotop показывает количество операций ввода-вывода, выполненных с момента запуска iotop
-k, --kilobytes - выводит данные в килобайтах вместо байтов
-t, --time - Добавьте временную метку в каждую строку (подразумевается --batch). В каждой строке будет указано текущее время.
Более наглядную информацию можно получить, запустив iotop с ключами: -obPat
Для команды sudo iotop -p в качестве аргумента требуется число, обозначающее идентификатор процесса. Эта команда позволяет пользователю видеть конкретный процесс с помощью идентификатора процесса
Если вы используете sudo iotop -u home, то отображаются только операции ввода-вывода для пользователя home
Приоритет ввода вывода
Real-time (класс 1) — процесс всегда будет первым совершать операции ввода вывода, если ему это понадобится. Имеет уровни от 0 до 7.
Best-effort (класс 2)— все процессы которые запускаются в системе по умолчанию получают этот класс. В зависимости от уровня получают определенное время на работу с диском. Имеет уровни от 0 до 7.
Idle (класс 3) — процесс получит доступ к диску только когда другие процессы его не используют. Не имеет уровней.
Уровень класса — это число от 0 до 7, при этом уровень 0 — это наивысший приоритет в данном класе
#Наиболее удобный вывод обеспечивают следующие параметры:
iotop -obPat
pidstat
pidstat отображает активность процессов в режиме реального времени
sudo pidstat -d 1
#Отобразить статистику по конкретному процессу
sudo pidstat -p 2980 -d 1
fatrace
С помощью iotop мы нашли информацию о процессе, насилующим диск, с помощью fatrace можно найти путь по которым производится запись
fatrace отслеживает изменения файловой системы
sudo apt install fatrace
sudo fatrace -f Wk
#записать всю файловую активность в лог файл
fatrace -t -s 60 -o ~/fatrace.log
strace
Более детально разобраться с тем, что пишет процесс на диск можно с помощью strace, указав ему в качестве параметра PID процесса
#PID процесса или процессов можно узнать с помощью pgrep
sudo pgrep yandex_browser
2980
...
...
#Или так
sudo ps -aux | grep yandex_browser
#Далее можно использовать strace
sudo strace -e trace=write -p 2980
blktrace и btrace, blkparce
blktrace запускает трассировку драйвера блочного устройства в ядре и возвращает данные трассировки, которые можно обработать помимо iowatcher с помощью blkparse. Для удобства был также создан инструмент btrace, который запускает blktrace и blkparse
btrace
Утилита btrace в Linux позволяет посмотреть общую дисковую активность отдельного устройства
btrace - выполнение оперативной трассировки для блочных устройств
-s - Отображает данные, отсортированные по программам ( blkparse )
-t - Отображает временные интервалы для каждого ввода-вывода
-w n - Устанавливает время выполнения равным указанному количеству секунд
-n n - Определяет количество используемых буферов
-b n - Определяет размер буфера для извлечения событий (масштабируется на 1024)
-r
-a - Добавляет маску к текущему фильтру
#Установка
sudo apt install blktrace
#В течении 60 секунд утилита будет анализировать дисковую активность процессов и потоков ядра. В завершении покажет сводную статистику.
#вы получите сводную информацию о состоянии диска с подробной информацией о пропускной способности операций чтения и записи Throughput (R/W)
btrace -w 60 /dev/sda
~$ sudo btrace -w 60 /dev/sda
8,0 0 1 0.000000000 19796 A W 62671248 + 8 <- (8,3) 61616528
8,0 0 2 0.000001079 19796 Q W 62671248 + 8 [kworker/u16:2]
8,0 0 3 0.000006497 19796 G W 62671248 + 8 [kworker/u16:2]
8,0 0 4 0.000007248 19796 P N [kworker/u16:2]
8,0 0 5 0.000008528 19796 U N [kworker/u16:2] 1
8,0 0 6 0.000009324 19796 I W 62671248 + 8 [kworker/u16:2]
8,0 0 7 0.000015253 19796 D W 62671248 + 8 [kworker/u16:2]
8,0 0 8 0.000054694 19796 A W 465215008 + 16 <- (8,3) 464160288
blktrace
blktrace - генерирует трассировки трафика ввода-вывода на блочных устройствах
blktrace - это механизм отслеживания ввода-вывода на уровне блоков, который предоставляет подробную информацию об операциях с очередями запросов вплоть до пользовательского пространства.
Существует три основных компонента: компонент ядра, утилита для записи информации трассировки ввода-вывода для ядра в пространство пользователя и утилиты для анализа и просмотра информации трассировки
Утилита blktrace извлекает трассировки событий из ядра (посредством ретрансляции через файловую систему отладки)
У каждого отслеживаемого устройства есть файл, созданный в подключенном каталоге для debugfs, который по умолчанию имеет значение /sys/kernel/debug - это можно переопределить с помощью аргумента командной строки -r
ирает все события, которые можно отследить. Чтобы ограничить количество отслеживаемых событий, вы можете указать одну или несколько масок фильтра с помощью параметра -a
Как отмечалось выше, события передаются через ряд буферов, сохраненных в файлах debugfs. Размер и количество буферов можно задать с помощью аргументов -b и -n соответственно
blktrace сохраняет извлеченные данные в файлах, хранящихся в локальном каталоге
Формат имен файлов (по умолчанию) - device.blktrace.cpu, где device - это базовое имя устройства (например, если мы отслеживаем /dev/sda, базовым именем устройства будет sda); а cpu идентифицирует центральный процессор для потока событий
Часть имени файла событий, относящаяся к устройству, может быть изменена с помощью опции -o
blktrace также может быть запущен одновременно с blkparse для получения оперативного вывода - для этого укажите -o - для blktrace
Поведение blktrace по умолчанию заключается в том, чтобы работать вечно, пока пользователь явно не уничтожит его (с помощью control-C или отправки сигнала SIGINT процессу с помощью вызова утилиты kill (1))
C помощью blktrace можно решать следующие задачи:
анализировать производительность блочных устройств;
рассчитывать затраты ресурсов
определить оптимальную конфигурацию для программного оркужения
оценивать производительность различных файловых систем
Опции:
-a mask --act-mask=mask Add mask to current filter (see below for masks)
-b size --buffer-size=size Определяет размер буфера для извлечения событий (в масштабе 1024). Размер буфера по умолчанию равен 512 Кбайт
-d dev --dev=dev Добавляет dev в качестве устройства для отслеживания
-I file --input-devs=file - Добавляет устройства, в качестве устройств для отслеживания
-n num-sub - Указывает количество используемых буферов. В blktrace по умолчанию используется 4 дополнительных буфера
-l --listen - Запуск в режиме прослушивания сети (сервер blktrace)
-h hostname - Запуск в режиме сетевого клиента с подключением к данному хосту
-p number - Используемый сетевой порт (по умолчанию 8462)
-s - Сделайте так, чтобы сетевой клиент НЕ использовал функцию sendfile() для передачи данных
-o basename - задает базовое имя для входных файлов
-D dir - Добавляйте файл в качестве дополнения к имени (ам) выходного файла(ов)
-r rel-path - Указывает точку подключения debugfs
-w seconds - Устанавливает время выполнения равным указанному количеству секунд
Маски могут быть переданы с помощью параметра командной строки -a
barrier: barrier attribute
complete: completed by driver
fs: requests
issue: issued to driver
pc: packet command events
queue: queue operations
read: read traces
requeue: requeue operations
sync: synchronous attribute
write: write traces
notify: trace messages
drv_data: additional driver specific trace
blktrace различает два типа запросов на уровне блоков: файловая система и SCSI команды. Первые называются запросами fs, вторые - запросами pc
Запросы файловой системы - это обычные операции чтения/записи, то есть любые операции чтения или записи с определенного места на диске заданного размера
Эти запросы обычно исходят от пользовательского процесса, но они также могут быть инициированы виртуальной машиной, сбрасывающей грязные данные на диск, или файловой системой, синхронизирующей суперблок или блок журнала с диском.
pc - это команды SCSI. blktrace отправляет блок командных данных в качестве полезной нагрузки, чтобы blkparse мог его расшифровать
Чтобы отследить ввод-вывод на устройстве /dev/hda и преобразовать выходные данные в удобочитаемую форму, используйте следующую команду:
blktrace -d /dev/sda3 -o - | blkparse -i -
#Такого же поведения можно добиться с помощью удобного скрипта btrace
btrace /dev/sda3
#Чтобы отследить ввод-вывод на устройстве и сохранить выходные данные для последующей обработки с помощью blkparse
blktrace -w 10 /dev/sda3
#информация впоследствии может быть проанализирована утилитой blkparse:
blkparse sda3
~$ sudo blktrace -w 5 -d /dev/sda3
=== sda3 ===
CPU 0: 190 events, 9 KiB data
CPU 1: 10 events, 1 KiB data
CPU 2: 74 events, 4 KiB data
CPU 3: 999 events, 47 KiB data
Total: 1273 events (dropped 0), 60 KiB data
В выводе отображается таблица о загрузке процессорных ядер, что дает мало информации для оценки производительности. Поэтому следует использовать дополнительную утилиту blkparse из установленного пакета
Для примера выводится статистика только по одному ядру
8,0 3 1 0.000000000 6011 A W 197287216 + 8 <- (8,3) 196232496
8,3 3 2 0.000000903 6011 Q W 197287216 + 8 [kworker/u16:5]
8,3 3 3 0.000006925 6011 G W 197287216 + 8 [kworker/u16:5]
8,3 3 4 0.000007723 6011 P N [kworker/u16:5]
8,0 3 5 0.000010391 6011 A W 197287256 + 8 <- (8,3) 196232536
8,3 3 6 0.000010728 6011 Q W 197287256 + 8 [kworker/u16:5]
................
...........
.........
CPU3 (sda3):
Reads Queued: 0, 0KiB Writes Queued: 59, 396KiB
Read Dispatches: 1, 0KiB Write Dispatches: 23, 392KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB
Read Merges: 0, 0KiB Write Merges: 35, 152KiB
Read depth: 1 Write depth: 16
IO unplugs: 3 Timer unplugs: 2
Total (sda3):
Reads Queued: 0, 0KiB Writes Queued: 91, 824KiB
Read Dispatches: 2, 0KiB Write Dispatches: 53, 824KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 2, 0KiB Writes Completed: 54, 824KiB
Read Merges: 0, 0KiB Write Merges: 38, 164KiB
IO unplugs: 5 Timer unplugs: 3
Throughput (R/W): 0KiB/s / 402KiB/s
Events (sda3): 452 entries
Skips: 0 forward (0 - 0.0%)
В выводе можно увидеть следующую информацию по столбцам:
мажорный и минорный номера устройства (в нашем случае 8, 32);
ядро, задействованное при выполнении операции;
порядковый номер операции;
время выполнения операции (в миллисекундах);
идентификатор процесса (PID);
событие
RWBS (R —чтение, W — запись, B — барьерная операция, S — синхронная операция);
блок, с которого началось выполнение операции+число блоков;
имя процесса, выполнившего операцию (указывается в квадратных скобках).
Основные операции обозначаются так:
A — операция ввода-вывода была передана другому устройству;
C — операция завершена;
F — операция объединена со смежной операцией в очереди;
I — запрос на выполнение операции поставлен в очередь;
M — операция объединена со смежной операцией в очереди;
Q — операция поставлена в очередь;
T — отключено по причине таймаута;
X — операция разбита на несколько операций.
Далее blkparse выводит cуммарную информацию обо всех операциях ввода-вывода и сравнивает уровень загруженности операций чтения и операций записи
btt
В качестве дополнительного инструмента может использоваться утилита btt
#Вывод в файл
blktrace -d /dev/sda -o- > trace
#Обработка с помощью blkparse
blkparse -i trace -d trace1
#Теперь обработаем полученный вывод с помощью btt
btt -i trace1
На экран будет выведен отчет, представленный в виде таблицы
iowatcher
С помощью iowatcher можно строить графики (в том числе и анимированные) на основе выводов blktrace, а также утилит btt, fio и mstat.
Наиболее часто используемые параметры запуска:
-d – определяет, какое устройство отслеживать, параметр перенаправляется в blktrace для создания новой трассировки;
-p – инициирует запуск другой программы во время снятия трассировки. Программа и аргументы ее запуска должны быть указаны после всех остальных параметров утилиты iowatcher;
-K – сохраняет файлы SVG для создания анимированного графика;
-t – определяет расположение и имя файла, в котором хранятся трассировки blktrace. Можно указывать только каталог с набором трассировок;
-l – добавляет метки на графике;
-m – создает анимированный график;
-T – задает заголовок, который будет размещен в верхней части графика;
-o – определяет расположение и имя файла для SVG или видео;
-h – задает высоту графика;
-w – задает ширину графика;
-с – количество столбцов в графике;
-x – ограничивает диапазон обрабатываемого времени;
-P – различать процессы в графике ввода/вывода;
-O – позволяет генерировать только необходимые графики (по умолчанию генерируются все);
-N – противоположность параметра -О, определяет тот график, который нужно пропустить.
Варианты графиков – io, tput, latency, queue_depth, iops, cpu-sys, cpu-io, cpu-irq, cpu-user, cpu-soft.
blktrace -w 30 -d /dev/sdf -o- > trace.dump
#Создать график из существующего файла трассировки:
iowatcher -t trace.dump -o trace.svg
#Анимированный график можно получить при помощи команды:
iowatcher -t trace.dump --movie -o trace.mp4/
Источники:
https://redos.red-soft.ru/base/redos-7_3/7_3-administation/7_3-system-perf/7_3-blktrace-iowatcher/?nocache=1733655605772
https://engineer.yadro.com/article/storage-bugs/
iostat
iostat - Предоставляет статистику центрального процессора (CPU) и статистику ввода-вывода для устройств и разделов.
Команда iostat используется для мониторинга загрузки системных устройств ввода-вывода путем определения времени активности устройств в зависимости от их средней скорости передачи данных.
Команда iostat генерирует отчеты, которые можно использовать для изменения конфигурации системы, чтобы лучше сбалансировать нагрузку ввода-вывода между физическими дисками.
Команда iostat генерирует два типа отчетов: отчет об использовании процессора и отчет об использовании устройства.
В многопроцессорных системах статистика по процессорам вычисляется в масштабе всей системы как среднее значение по всем процессорам. Отображается строка заголовка устройства, за которой следует строка статистики по каждому настроенному устройству.
Параметр interval определяет промежуток времени в секундах между каждым сообщением. Параметр count может быть указан совместно с параметром interval.
Если указан параметр count, значение count определяет количество отчетов, сгенерированных с интервалом в несколько секунд.
Отчет имеет следующий формат:
%user - Показывает процент загрузки процессора, который произошел во время выполнения на уровне пользователя (приложения).
%nice - Показывает процент загрузки процессора, который произошел при выполнении на уровне пользователя с хорошим приоритетом
%system - Показывает процент загрузки процессора, который произошел во время выполнения на системном уровне (ядре)
%iowait - Показывает процент времени, в течение которого центральный процессор или несколько процессоров простаивали и в течение которого система не выполнила запрос на ввод-вывод с диска
%steal - Показывает процент времени, затраченного виртуальным процессором или процессорами на вынужденное ожидание, в то время как гипервизор обслуживал другой виртуальный процессор
%idle - Показывает процент времени, в течение которого центральный процессор или несколько процессоров простаивали и у системы не было невыполненных запросов на дисковый ввод-вывод
Отчет об устройстве предоставляет статистику по каждому физическому устройству или разделу
Если ни устройство, ни раздел не указаны, то статистика отображается для каждого устройства, используемого системой, при условии, что ядро поддерживает статистику для него
В зависимости от используемых флагов в отчете могут отображаться следующие поля:
Device: В этом столбце указано имя устройства
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) - объем данных, отбрасываемых устройством, выраженный в количестве блоков (килобайт, мегабайт) в секунду
Blk_read (kB_read, MB_read) - Общее количество прочитанных блоков (килобайт, мегабайт)
Blk_wrtn (kB_wrtn, MB_wrtn) - Общее количество записанных блоков (килобайт, мегабайт)
Blk_dscd (kB_dscd, MB_dscd) - Общее количество удаленных блоков (килобайт, мегабайт)
Продолжение: https://manpages.ubuntu.com/manpages/focal/man1/iostat.1.html
Опции:
-c - только отчет об использовании процессора
-d - только отчет об использовании устройства
ALL - ALL означает все блочные устройства, определенные системой
-H - Этот параметр должен использоваться с параметром -g и указывает, что должна отображаться только глобальная статистика по группе, а не статистика по отдельным устройствам в группе.
-k - Отображение статистики в килобайтах в секунду
-m - Отображение статистики в мегабайтах в секунду
-N - Отобразите зарегистрированные в device mapper имена для любых устройств device mapper. Полезно для просмотра статистики LVM2
-o - Отображайте статистику в формате JSON
-p - Параметр -p отображает статистику по блочным устройствам и всем их разделам, которые используются системой, ключевое слово ALL указывает, что статистика должна отображаться по всем блочным устройствам и разделам, определенным системой, включая те, которые никогда не использовались
-s - короткая версия отчета
-t - время для каждого отображаемого отчета
-x - Отображение расширенной статистики
-z - не выводить данные для любых устройств, для которых в течение периода выборки не было никакой активности
Команда iostat учитывает следующие переменные среды:
POSIXLY_CORRECT - Когда эта переменная установлена, скорость передачи отображается блоками по 512 байт вместо блоков по умолчанию в 1 тыс
S_COLORS - Когда эта переменная установлена, статистика отображается в цветном режиме на терминале. Возможные значения для этой переменной - never, always или auto (последнее используется по умолчанию)
S_COLORS_SGR - дает возможность указать цвета и другие атрибуты, используемые для отображения статистики на терминале
#непрерывный отчет об устройстве с интервалом в две секунды
sudo iostat -d 2
#Отображение шести отчетов с интервалом в две секунды для всех устройств
sudo iostat -d 2 6
#Отображение шести отчетов расширенной статистики с интервалом в две секунды для устройств sda и sdb
iostat -x sda sdb 2 6
#Отображение шести отчетов с интервалом в две секунды для sda устройства и всех его разделов
iostat -p sda 2 6
Файлы
/proc/stat - содержит системную статистику
/proc/uptime - содержит время безотказной работы системы
/proc/diskstats - содержит статистику дисков
/sys - содержит статистику по блочным устройствам
/proc/self/mountstats - содержит статистику по сетевым файловым системам
/dev/disk - содержит постоянные имена устройств
Утилита duf
Преимущество duf заключается в том, что эта программа представляет данные в удобном для просмотра виде
duf --help
lsof
lsof - позволяет узнать о том, какие именно файлы открыты в системе, какими процессами и пользователями открыты файлы
Источники
Связанные темы
Оптимизация запросов в Postgresql
Использование модуля pg_stat_statements в postgresql
Поиск уязвимостей и следов взлома в Linux
Управление планировщиком в Postgresql
Оптимизация производительности
Системные каталоги в Postgresql
Анализ производительности виртуальной машины
Мониторинг событий в linux с помощью auditd
Использование RAID массивов в Linux
Настройка виртуального сервера Nginx
Оптимизация производительности Postgresql