eBPF позволяет загружать программы в ядро Linux и подключать их к поддерживаемым событиям без написания обычного модуля ядра. Его применяют для трассировки, профилирования и обработки сети. Verifier проверяет программу перед загрузкой, но не гарантирует отсутствие ошибок реализации, логических проблем или накладных расходов.
Что такое eBPF и для чего его используют?
eBPF позволяет подключать ограниченные программы к событиям Linux. Разбираем точки подключения, maps, verifier и ограничения технологии.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
eBPF — механизм программируемого расширения поведения Linux: небольшие программы загружаются в ядро и выполняются в поддерживаемых точках подключения. Можно собирать метрики, исследовать задержки, обрабатывать сетевые пакеты и реализовывать наблюдение за событиями без внесения собственного изменения в исходный код ядра.
Типичный цикл состоит из подготовки программы, проверки ядром при загрузке и подключения к выбранному событию. Это могут быть tracepoints, точки трассировки функций, сетевые или cgroup-механизмы. Пользовательская часть приложения управляет загрузкой и получает результаты. Такой жизненный цикл описан в документации libbpf.
BPF maps позволяют хранить данные и обмениваться ими между программами BPF и пользовательской частью. Например, программа может обновлять счетчики, а обычный процесс — читать их и формировать отчет. Конкретные доступные операции определяются типом программы и поддержкой ядра.
Перед принятием программы ядро применяет verifier: анализирует состояния регистров, доступ к памяти и допустимость вызовов. Нельзя произвольно обратиться к любой памяти или вызвать любую функцию. Правила и примеры отказа описаны в документации verifier.
Однако успешная проверка не доказывает корректность прикладной логики и не означает нулевую стоимость исполнения. Само ядро и проверяющий компонент тоже могут содержать ошибки. Возможности, необходимые привилегии и ограничения зависят от версии и конфигурации системы.
Практический пример — определить, на каких операциях ввода-вывода растут задержки, собирая агрегированные измерения. Перед использованием оценивают частоту событий, объем собираемых данных и влияние инструмента на наблюдаемую нагрузку.