Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
LINUX-EBPF-BCC-BPFTRACE-PROFILING Linux / DevOps

Гайд: Профилирование производительности ядра с помощью eBPF инструментов (BCC tools, bpftrace)

Обновлено: 21.08.2026  ·  Официальная база знаний

Революция observability ядра Linux с помощью технологии eBPF

Технология eBPF (Extended Berkeley Packet Filter) позволяет безопасно выполнять специализированные мини-программы прямо внутри адресного пространства ядра Linux без изменения его исходного кода и без необходимости загрузки сторонних нестабильных модулей (LKM). eBPF-программы компилируются в байткод, валидируются встроенным верификатором безопасности ядра (eBPF Verifier) и исполняются через JIT-компилятор с околонулевым оверхедом (overhead < 1%). Наборы инструментов BCC (BPF Compiler Collection) и декларативный трейсер bpftrace позволяют расследовать аномалии, невидимые классическими утилитами (top, iostat, strace):

  • Скрытые задержки блочного I/O (I/O Latency Spikes): iostat показывает средние значения, скрывая единичные блокировки диска на 5000 мс;
  • Микро-задержки системных вызовов (Syscall Stalls): Необъяснимые зависания приложений на миллисекунды в вызовах futex, epoll_wait, fsync;
  • Скрытые сбросы TCP-пакетов и аномалии сетевого стека: Детектирование сбросов на уровне внутренних функций ядра tcp_drop();
  • Блокировки внутри самого ядра: Трассировка времени удержания спинлоков (Spinlocks) и мьютексов.

Бизнес-риски

Невозможность локализации плавающих проблем с высокой задержкой (p99/p99.9 latency SLA), деградация производительности продакшена из-за использования тяжелого strace (strace может замедлять процессы в 10–100 раз!).

Инструменты eBPF экосистемы Linux

ИнструментУровень абстракцииНазначение
BCC ToolsГотовые CLI-утилиты на Python/CМгновенная диагностика типовых проблем (диск, сеть, память, CPU).
bpftraceВысокоуровневый язык сценариев (DTrace-like)Написание кастомных однострочников и ad-hoc профилирования на лету.
libbpf / CO-REНизкоуровневая библиотека C/Go/RustСоздание встраиваемых production-агентов мониторинга (Datadog, Cilium).

Регламент профилирования системы инструментами eBPF

Сценарий 1: Установка набора инструментов BCC и bpftrace

# Для Ubuntu / Debian:
sudo apt update
sudo apt install -y bpfcc-tools bpftrace linux-headers-$(uname -r)

# Для RHEL / AlmaLinux / Rocky Linux:
sudo dnf install -y bcc-tools bpftrace kernel-devel-$(uname -r)

Сценарий 2: Анализ дисковых задержек (I/O Latency) с помощью biolatency и biosnoop

Классический iostat показывает среднее время. Утилита biolatency строит детальную гистограмму распределения задержек по степеням двойки (Power-of-2 Histogram):

# 1. Построение гистограммы реальной задержки физического дискового I/O в микросекундах:
sudo biolatency-bpfcc 1 10
# Пример вывода: большинство запросов укладываются в 256-512 мкс, но есть хвост из запросов > 2 000 000 мкс (2 сек)!

# 2. Вывод каждого дискового запроса длиннее 100 миллисекунд с именем процесса:
sudo biosnoop-bpfcc | awk '$4 > 100'

Сценарий 3: Трассировка медленных сетевых TCP-соединений и сбросов пакетов

# 1. Трассировка задержки установки всех исходящих TCP-соединений (SYN -> SYN-ACK RTT):
sudo tcpconnect-bpfcc -d

# 2. Детектирование сброшенных ядром TCP-пакетов с указанием стека вызовов ядра (Kernel Stack):
sudo tcpdrop-bpfcc

Сценарий 4: Написание мощных однострочников на bpftrace

# 1. Подсчет количества вызовов системных функций конкретным процессом (например, mysqld):
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter /comm == "mysqld"/ { @[ksym(args->id)] = count(); }'

# 2. Построение гистограммы времени выполнения системного вызова read() в наносекундах:
sudo bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'

# 3. Отслеживание открытия файлов процессами с возвращаемыми именами путей:
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s (%d): %s\n", comm, pid, str(args->filename)); }'

Сценарий 5: Анализ выполнения команд процессов (Execsnoop)

# Мониторинг всех запускаемых в системе короткоживущих процессов (ловцы спам-скриптов и cron):
sudo execsnoop-bpfcc

Типовые ошибки администраторов

  • Использование утилиты strace на продакшен-базах данных: strace использует точку останова ptrace, останавливая выполнение процесса на каждом системном вызове, что может полностью обрушить высоконагруженный MySQL/PostgreSQL. Всегда используйте безопасный bpftrace / syscount-bpfcc!
  • Забытые заголовки ядра (linux-headers): Компиляция BCC скриптов требует установленного пакета linux-headers-$(uname -r), точно совпадающего с текущей версией запущенного ядра.
Не удается локализовать скрытые миллисекундные задержки (p99 latency) в микросервисах?
Эксперты ITSTM проведут глубокое профилирование ядра через eBPF/FlameGraphs, выявят блокировки в Userspace/Kernel и устранят узкие места архитектуры.
Практический опыт инженера: При расследовании сложных проблем с производительностью в HighLoad-системах всегда начинайте диагностику с триады BCC: biolatency (диск), tcprtt (сеть) и runqlat (задержки планировщика CPU Scheduler в очереди runqueue). Это позволяет локализовать реальный сбоящий домен инфраструктуры за считанные минуты.

Частые вопросы (FAQ)

В чем главное преимущество eBPF перед strace?

strace переключает контекст между ядром и процессором трассировки на КАЖДЫЙ системный вызов (замедляя целевой сервис до 100 раз). eBPF выполняет фильтрацию и агрегацию данных прямо внутри ядра в памяти, создавая оверхед менее 1%.

Что такое FlameGraph (Огненный граф) и как его построить через eBPF?

Флеймграф визуализирует самые горячие функции CPU. Постройте его с помощью profile-bpfcc: sudo profile-bpfcc -F 99 -df 30 > out.profile, затем конвертируйте в SVG утилитой flamegraph.pl.

Безопасно ли использовать bpftrace на Production-серверах?

Да. Верификатор ядра eBPF гарантирует, что скрипт bpftrace не может зациклиться, повредить память ядра или привести к Kernel Panic.

Поддерживается ли eBPF в старых версиях Linux?

Полноценная поддержка eBPF доступна в ядрах Linux 4.19+. Для максимального функционала (BTF, CO-RE, fexit probes) рекомендуется ядро Linux 5.8+.