BCC — Суперзрение для вашего Linux-сервера
Знакомая ситуация: приложение в продакшене внезапно начинает тормозить, но стандартные top и iostat показывают, что всё в пределах нормы? Или нужно понять, какой именно процесс постоянно читает один и тот же файл, создавая ненужную нагрузку? Часто в таких случаях мы погружаемся в логи, пытаясь отыскать причину по косвенным признакам. А что, если бы можно было заглянуть прямо «под капот» ядра Linux и увидеть всё своими глазами, не рискуя при этом обрушить всю систему?
Именно такую возможность и даёт проект iovisor/bcc — настоящий швейцарский нож для любого, кто работает с Linux на серьёзном уровне.

Что такое BCC и при чём тут eBPF?
Если коротко, BCC (BPF Compiler Collection) — это набор инструментов и фреймворк для создания программ, которые безопасно выполняются прямо в ядре Linux. В основе всей этой магии лежит технология eBPF (extended Berkeley Packet Filter).
Представьте, что ядро Linux — это строго охраняемый объект, куда нельзя просто так зайти и что-то поменять. А eBPF — это как система пропусков для маленьких, но очень умных роботов-инспекторов. Вы пишете программу-инспектора, система проверяет, что она безопасна (не зависнет, не сломает ничего), и запускает её в «святая святых» — в самом ядре. Там ваш инспектор может наблюдать за системными вызовами, сетевыми пакетами, работой файловой системы и докладывать вам наверх обо всём, что происходит.
Раньше для подобного требовались модули ядра, а это сложно, опасно и требует перекомпиляции при каждом обновлении. BCC же делает работу с eBPF на удивление простой, позволяя писать логику на C, а управлять всем из удобных скриптов на Python или Lua.
Чем это может быть полезно разработчику?
Самое ценное в BCC — это готовый набор утилит для диагностики производительности, сети и системных событий. Их там десятки, и каждая решает конкретную проблему. Вам не нужно быть экспертом по ядру, чтобы начать ими пользоваться.
Вот лишь несколько примеров, чтобы вы прочувствовали мощь:
1. Анализ дисковой подсистемы
biolatency: Показывает распределение задержек дисковых операций в виде гистограммы. Сразу видно, есть ли у вас проблемы с медленными дисками.opensnoop: Отслеживает системный вызовopen()в реальном времени. Незаменимая вещь, чтобы понять, какие файлы постоянно открывает ваше приложение.filetop: Показывает топ файлов по количеству операций чтения/записи. Помогает найти самые «горячие» файлы в системе.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 -> 1 : 3 | |
2 -> 3 : 0 | |
4 -> 7 : 211 |********** |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 1 | |
128 -> 255 : 800 |**************************************|
На скриншоте утилита bitehist, которая показывает распределение размеров дисковых I/O. Сразу видна бимодальная картина: много мелких операций и очень много операций размером 128-255 КБ.
2. Диагностика сети
tcptop: Отображает сетевую активность в стилеtop, показывая хосты, с которыми идёт наиболее интенсивный обмен данными.tcpconnect: Трассирует попытки установки TCP-соединений. Помогает отловить проблемы с подключением к базам данных или внешним сервисам.sslsniff: Позволяет перехватывать и просматривать данные, которыми обмениваются приложения через зашифрованные соединения OpenSSL. Да, вы правильно прочитали. Это невероятно мощный инструмент для отладки.
3. Профилирование производительности
execsnoop: Показывает все новые процессы, запускаемые в системе черезexec(). Отлично подходит для аудита безопасности или поиска неожиданных дочерних процессов.funccount: Считает, сколько раз была вызвана та или иная функция ядра.memleak: Помогает обнаружить утечки памяти, показывая места выделения памяти, которая не была освобождена.
И это лишь верхушка айсберга. Взгляните на эту схему — она даёт представление о масштабах инструментария:

Как это работает под капотом?
Каждая утилита BCC обычно состоит из двух частей:
- C-код: Небольшая программа, которая компилируется в байт-код eBPF. Именно она прикрепляется к нужным событиям в ядре (например, к вызову функции
vfs_read) и собирает данные. - Python-скрипт: Пользовательский интерфейс. Он загружает eBPF-программу в ядро, создаёт специальные структуры данных (карты) для обмена информацией с ней и в красивом виде выводит результаты на экран.
BCC берёт на себя всю сложную работу: компиляцию C-кода с помощью встроенного LLVM, проверку байт-кода верификатором ядра и его загрузку. Вам остаётся только запустить Python-скрипт.
Практические кейсы: когда BCC незаменим?
- Поиск "медленных" запросов к базе данных: Утилиты
dbslowerиdbstatмогут отслеживать запросы к MySQL/PostgreSQL, которые выполняются дольше заданного порога, прямо на уровне системных вызовов, без необходимости включать логи в самой БД. - Анализ задержек планировщика: Если ваше приложение "замирает" без видимых причин, утилита
runqlatпокажет, как долго задача ждала своей очереди на исполнение в планировщике CPU. Это может выявить проблемы с "шумными соседями" на сервере. - Отладка сложных сетевых взаимодействий: Нужно понять, почему контейнер не может достучаться до внешнего мира?
tcpconnectиtcpdropпокажут все попытки соединений и отброшенные ядром пакеты с указанием причины.
Заключение: кому стоит попробовать BCC?
BCC — это инструмент, который должен быть в арсенале каждого DevOps/SRE инженера, специалиста по производительности и даже опытного бэкенд-разработчика, работающего с Linux. Он открывает совершенно новый уровень наблюдаемости (observability) системы.
Да, порог входа чуть выше, чем у htop, но отдача несоизмерима. Возможность безопасно и динамически подключаться к работающему ядру для анализа проблем — это настоящая суперсила.
Если вы устали отлаживать сложные проблемы, опираясь только на логи и косвенные метрики, настоятельно рекомендую заглянуть в репозиторий iovisor/bcc. Начните с готовых утилит из папки tools, и, возможно, вы уже никогда не вернётесь к старым методам диагностики.
