Вступление
Классический инструмент 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 с суффиксом -bpfccrunqlat: анализ задержек в очереди выполнения
Утилита показывает распределение времени, которое процессы проводят в очереди 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 1offcputime: что заставляет процессы "спать"
Инструмент показывает, где процессы теряют время в ожидании (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 latency | Average delay, Maximum delay |
| Анализ последовательности переключений | perf sched script | Timestamp, Delay, Function |
| Распределение времени в очереди RUNQ | runqlat-bpfcc | Гистограмма задержек по диапазонам |
| Причины ожидания процессов | offcputime-bpfcc | Время ожидания, стек вызовов |
| Задержки дискового I/O | biosnoop-bpfcc | Latency (время завершения операции) |
| Блокировки файлов | locksnoop-bpfcc | Время удержания блокировки |
Заключение
Полный переход на инструменты eBPF и perf обеспечивает детальную диагностику задержек в современных Linux-системах. BCC tools дают информацию на уровне стека вызовов, что невозможно в классическом LatencyTOP. Для большинства задач анализа производительности достаточно связки runqlat для CPU и offcputime для анализа ожиданий, с периодическим использованием perf sched для общей картины.