- Первый инструмент — отец трассировки
- Какие инструменты использовались в Linux
- Когда появился BPF, что это такое и как используют его в мониторинге Linux-задач
- Как установить eBPF Trace
- Особенности одного из преимуществ eBPF Trace
- Инструменты BPF Trace
- Заключение
Трассировка нужна для программиста, чтобы видеть последовательность выполнения команд. Он просматривает с помощью ее инструментов значения переменных на каждом шаге выполняемой программы. Трассировка дает возможность увидеть ошибки и вовремя их исправить.
Первый инструмент — отец трассировки
DTrace считается отцом трассировки. Этот фреймворк был создан для динамического трейсинга. Впервые он появился в 2001 году. Однако в основу Linux так и не лег, хотя в 2011-м был использован Oracle Unbreakable Linux. Эту ОС использует мало людей, поэтому DTrace не распространился среди программистов, работающих на Linux.
Работа DTrace заключается в замене инструкций центрального процессора на вызов этого инструмента. Записывается вся информация, собранная отцом трассировки, на языке D, схожим с C и Awk.
Поэтому трассировка на Linux развивалась медленными темпами за счет решений, которые придумывали программисты.
Какие инструменты использовались в Linux
До того как был разработан eBPF из машины фильтрации пакетов файерволлом, программисты использовали множество инструментов. Но все они имели ограничения.
Вот некоторые из инструментов трассировки:
- strace — дает возможность заглянуть в создание системных вызовов. Ограничения заключаются в том, что не дают возможности увидеть, что происходит внутри системного вызова;
- ltrace. С помощью этого инструмента можно увидеть, как вызывают динамические библиотеки. Ограничения заключаются в том, что не дают возможности увидеть, что происходит внутри библиотечного вызова.
С помощью них нельзя собрать информацию с нескольких источников или трассировать данные из них.
Инфраструктура трейсинга:
- интерфейс инструментизации ядра — Kprobe, Uprobe, Dtrace probe;
- утилита, которая работает с этими инструментами, — Kernel module;
- фронтенд-инструменты — Perf, System Trap.
По сути, ни о какой серьезной наблюдаемости или мониторинге здесь речи идти не могло. Но все это было до того, как ввели систему мониторинга посредством eBPF.
Когда появился BPF, что это такое и как используют его в мониторинге Linux-задач
BPF появился в 1992 году. Поначалу его использовали как виртуальную машину для фильтра пакетов с помощью экранного защитника Firewall. Но разработчики Linux решили дополнить BPFTrace, и получилась его расширенная версия с приставкой «e».
С 2014 года еBPF используют для обработки событий. А вот элементы, которые были добавлены в него:
- регистры;
- стек;
- дополнительные структуры maps.
еBPF соединила то, что ранее делали программисты с помощью различных утилит.
eBPF — это программа, заключенная в специальный байт-код. Она включается в ядро и проводит обработку событий. Преимуществом ее является то, что в программе не используются циклы, которые могут вызвать «зависание» работы всего ядра.
Это безопасный байт-код потому, что модули kernel больше не вставляются через insmod. Теперь неопытный программист не сможет допустить ошибку в модуле, вставить его в систему и тем самым убить работу ядра, например из-за бинарной несовместимости.
Как происходит тогда трассировка событий в Linux с помощью eBPF:
- Человек создает утилиту eBPF.
- Ядро тестирует ее и подгружает к себе.
- Программа самостоятельно подключается к инструментам для отслеживания событий, обрабатывает все данные и сохраняет их в maps.
- Пользователь после этого может получить статистику, perf-эвенты и многое другое.
А вот и события, которые позволяет трейсить eBPF:
- специальные ивенты, типа Begin или End$;
- ивенты, основанные на kprobes;
- ивенты, основанные на BPF trampolines;
- события, основанные на tracepoints;
- статическая отладка в пространстве юзера;
- ивенты, основанные на подсистеме perf.
А теперь давайте научимся устанавливать программу для трассировки в Linux.
Как установить eBPF Trace
Чтобы выполнить установку eBPF, пользователю понадобится ядро версии 4,9 или младше. Если программа будет ставиться на более старшие ядра, то часть хороших фишек от утилиты будет недоступна.
Далее пользователь делает следующее:
- Открывает файл install.md из репозитория bcc.
- Проверяет, находятся ли в нем все флаги, которые понадобятся для установки, командой: zcat /proc/config.gz | grep BPF.
- Пользователь создает /etc/apt/sources.list.d/iovisor.list.
- Прописывает следующие команды:
sudo apt-get update;
sudo apt-get install bcc bcc-tools python-bcc.
Далее пользователь может приступать к написанию собственных команд либо применять проект из 100 готовых утилит.
Особенности одного из преимуществ eBPF Trace
Проект BCC подарил начинающим пользователям, роботам более ста уже написанных программ, используемых под определенные нужды. Это не просто недавно вышедший проект и не протестированный. Данными программами пользуются программисты, работающие в Facebook, Netflix.
Программы написаны на языке Питон, в который встроен псевдокод С. Основой являются библиотеки libbcc и libbpf. Код в утилитах можно менять, расширять или прописывать новые коды для совершенно новых программ.
Инструменты BPF Trace
BPF Trace содержит различные инструменты, которые являются примерами программирования. Например:
- tools/bashreadline.bt: печать введенных команд bash в масштабах всей системы;
- tools/biolatency.bt: задержка ввода-вывода блока в виде гистограммы;
- tools/biosnoop.bt: инструмент трассировки блочного ввода-вывода, показывающий задержку ввода-вывода;
- tools/biostacks.bt: показ задержки ввода-вывода диска со стеками инициализации;
- tools/bitesize.bt: показ размера ввода-вывода диска в виде гистограммы;
- tools/cpuwalk.bt: пример того, какие процессоры выполняют данные процедуры;
- tools/dcsnoop.bt: поиск в кэше записей каталогов трассировки (dcache);
- tools/execsnoop.bt: трассировка новых процессов с помощью системных вызовов exec ();
- tools/gethostlatency.bt: показ задержки для вызовов getaddrinfo/gethostbyname;
- tools/killsnoop.bt: трассировка сигналов, выдаваемых системным вызовом kill ().
Есть еще одна программа, которая помогает работать с трассировкой. По сути, это прародитель BPF Trace. Написана утилита в 2015 году шведом по имени Tobias Waldekranz. Называется она Ply.
Особенностями программы являются:
- минимум зависимостей. Если нужно отрезать все зависимости, то в ней есть свой компилятор «ply script language — BPF»;
- поддержка языка, похожего на Awk.
До сих пор эта утилита поддерживается и работает. Однако какие-то новые фичи не появляются. Подойдет она для тестирования сборки ядра на встроенной системе или для теста прототипов.
Заключение
Из вышеописанного пользователь может сделать выводы, что трассировка событий на Linux путем eBPF легка и проста. Однако для написания кода все равно нужно иметь хотя бы малейшее понимание того, как он пишется. В этом начинающим пользователям помогут курсы и программы обучения программированию от DevEducation.