DISK_IO_BOTTLENECK
Linux / DevOps
Диагностика производительности дисков в Linux: iostat, iotop, blktrace, fio
- Аномально высокое значение
%iowaitв выводеtop/htop. - Задержки ответов баз данных (MySQL, PostgreSQL) при чтении/записи.
- Рост очереди запросов к дискам (
aqu-sz) и времени отклика диска (await).
1. Анализ общей утилизации дисков через iostat
# Установка пакета sysstat
apt-get install -y sysstat || dnf install -y sysstat
# Мониторинг накопителей с интервалом в 1 секунду
iostat -xz 1 10Ключевые метрики: r_await / w_await (>15-20 мс для SSD/NVMe критично), %util (насыщение контроллера), aqu-sz (длина очереди).
2. Поиск процессов, создающих дисковую нагрузку через iotop
# Режим отслеживания только активных процессов с выводом накопленного I/O
iotop -o -P -a3. Бенчмарк производительности накопителя через fio
Тест случайного чтения/записи блоками 4k с симуляцией реальной нагрузки БД:
fio --name=randrw_test \
--filename=/tmp/fio_testfile \
--size=2G \
--readwrite=randrw \
--rwmixread=75 \
--bs=4k \
--ioengine=libaio \
--iodepth=64 \
--direct=1 \
--runtime=60 \
--time_based \
--group_reporting4. Глубокая трассировка очередей блочного уровня с помощью blktrace
blktrace -d /dev/sda -o - | blkparse -i -
Практический опыт инженера:
Если iotop показывает высокий I/O у процесса jbd2/sda-8, проблема кроется в журнале файловой системы ext4 при частых вызовах fsync(). Временное решение для логов или некритичных данных — опция монтирования data=writeback,noatime.
Частые вопросы (FAQ)
Почему показатель %util может показывать 100%, но диск не тормозит?
Для современных NVMe SSD и аппаратных RAID-массивов с параллельными очередями (Multi-Queue) показатель %util отражает лишь наличие хотя бы одного запроса в обработке. Ориентируйтесь на задержку (await) и IOPS, а не на %util.
Зачем в fio указывать флаг --direct=1?
Флаг direct=1 отключает кэширование страниц операционной системы (Page Cache), направляя операции ввода-вывода напрямую на контроллер диска для измерения честной аппаратной производительности.