Диагностика задержек Linux: замена LatencyTOP на eBPF и perf в Ubuntu/Debian

Вступление

Классический инструмент LatencyTOP, появившийся в эпоху ядра 2.6 и Ubuntu 8.10, давно не развивается. В современных системах с ядрами 5.x и 6.x его показания часто не отражают реальную картину. На смену старому LatencyTOP пришли инструменты на базе eBPF и perf, дающие точную диагностику причин задержек.

Часть 1: Подготовка ядра и проверка конфигурации

Перед использованием инструментов диагностики убедитесь в доступности необходимой отладочной информации в ядре.

# Проверка поддержки устаревшего LATENCYTOP (обычно отключен в современных ядрах)
grep CONFIG_LATENCYTOP /boot/config-$(uname -r)

# Критически важный параметр для perf sched
grep CONFIG_SCHEDSTATS /boot/config-$(uname -r)
# Должен быть =y или =m

# Активация сбора статистики планировщика (если не включена)
echo 1 | sudo tee /proc/sys/kernel/sched_schedstats

В современных дистрибутивах (Ubuntu 22.04/24.04, Debian 11/12) CONFIG_LATENCYTOP обычно отключен, а CONFIG_SCHEDSTATS включен по умолчанию. Без CONFIG_SCHEDSTATS инструмент perf sched будет показывать урезанную информацию.

Часть 2: Современная классика — perf для анализа планировщика

perf — стандартный инструмент профилирования, входящий в пакет linux-tools-generic.

# Установка на Ubuntu/Debian
sudo apt install linux-tools-$(uname -r) linux-tools-generic

# Замер общей латенси планировщика
sudo perf sched latency

Вывод показывает процессы с наибольшими задержками:

  • Task — имя процесса/потока
  • Runtime — фактическое время выполнения
  • Switches — количество переключений контекста
  • Average delay — средняя задержка
  • Maximum delay — максимальная задержка (ключевой показатель)

Для детального анализа цепочки событий:

# Запись активности планировщика
sudo perf sched record -- sleep 10

# Анализ последовательности переключений
sudo perf sched script -- latency

В выводе perf sched script критичны столбцы:

  • Timestamp — временная метка в секундах
  • Task — имя потока
  • Delay — задержка перед выполнением
  • Function — место в коде ядра, где произошло переключение

Ищите повторяющиеся паттерны задержек у одних и тех же процессов.

Часть 3: Мощь eBPF и BCC tools

BCC (BPF Compiler Collection) — основной инструментарий для динамической трассировки ядра на основе eBPF.

Установка bpfcc-tools

# Ubuntu 22.04/24.04
sudo apt install bpfcc-tools linux-headers-$(uname -r)

# Debian 11/12
sudo apt install bpfcc-tools linux-headers-$(uname -r)

# Все инструменты устанавливаются в /usr/sbin с суффиксом -bpfcc

runqlat: анализ задержек в очереди выполнения

Утилита показывает распределение времени, которое процессы проводят в очереди RUNQ перед получением CPU.

sudo runqlat-bpfcc 5 1

Пример вывода:

Tracing run queue latency... Hit Ctrl-C to end.
     usecs               : count     distribution
         0 -> 1          : 0        |                    |
         2 -> 3          : 0        |                    |
         4 -> 7          : 0        |                    |
         8 -> 15         : 0        |                    |
        16 -> 31         : 3        |***                 |
        32 -> 63         : 12       |**************      |
        64 -> 127        : 45       |****************************************|
       128 -> 255        : 8        |*********           |

Интерпретация: Гистограмма показывает количество процессов (count) и время ожидания (usecs). Пик в области 64-127 микросекунд — норма. Смещение распределения вправо (большие задержки) указывает на перегрузку CPU.

Для анализа конкретного процесса:

sudo runqlat-bpfcc -p 1428 5 1

offcputime: что заставляет процессы "спать"

Инструмент показывает, где процессы теряют время в ожидании (I/O, блокировки, семафоры).

# Сбор статистики за 10 секунд с выводом в формате flame graph
sudo offcputime-bpfcc -df 10 > offcpu.svg

Для текстового анализа:

sudo offcputime-bpfcc -p 1428 5

Ключевые столбцы вывода:

  • TIME — общее время ожидания (мс)
  • COUNT — количество событий ожидания
  • AVG — среднее время ожидания
  • COMM — имя процесса
  • STACK — стек вызовов ядра/пользовательского пространства

Ищите в стеке вызовов:

  • __lock_page_killable — ожидание страницы памяти
  • io_schedule — ожидание завершения I/O операции
  • rwsem_down_read_failed — блокировки на чтение
  • schedule_timeout — явное ожидание

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

# Анализ задержек дискового I/O
sudo biosnoop-bpfcc

# Отслеживание отдельных событий блокировки
sudo locksnoop-bpfcc

# Измерение времени между срабатыванием таймера и выполнением
sudo runqslower-bpfcc 1000  # показывать задержки более 1000 мкс

Часть 4: Резюме — сводная таблица инструментов

СитуацияИнструментКлючевые метрики
Общая оценка задержек планировщикаperf sched latencyAverage delay, Maximum delay
Анализ последовательности переключенийperf sched scriptTimestamp, Delay, Function
Распределение времени в очереди RUNQrunqlat-bpfccГистограмма задержек по диапазонам
Причины ожидания процессовoffcputime-bpfccВремя ожидания, стек вызовов
Задержки дискового I/Obiosnoop-bpfccLatency (время завершения операции)
Блокировки файловlocksnoop-bpfccВремя удержания блокировки

Заключение

Полный переход на инструменты eBPF и perf обеспечивает детальную диагностику задержек в современных Linux-системах. BCC tools дают информацию на уровне стека вызовов, что невозможно в классическом LatencyTOP. Для большинства задач анализа производительности достаточно связки runqlat для CPU и offcputime для анализа ожиданий, с периодическим использованием perf sched для общей картины.