Команда Linux bpftrace
bpftrace — это продвинутый инструмент трассировки, основанный на eBPF (extended Berkeley Packet Filter). Он позволяет разработчикам динамически наблюдать и анализировать состояние выполнения систем Linux без изменения кода ядра.
eBPF — революционная технология в ядре Linux. Она предоставляет безопасную среду виртуальной машины, которая может выполнять определяемый пользователем код в ядре. bpftrace построен поверх eBPF и предоставляет более простой высокоуровневый слой абстракции.
Основные преимущества bpftrace
Наблюдение за системой в реальном времени
- Не требуется перезапускать систему или приложения
- Чрезвычайно низкие накладные расходы на производительность
- Позволяет наблюдать как программы ядра, так и программы пользовательского пространства
Гибкие возможности зондирования
- Поддерживает несколько типов точек зондирования: вход/выход из функции, таймеры, аппаратные события и т. д.
- Позволяет трассировать системные вызовы, сетевые события, дисковый ввод-вывод и т. д.
Простой язык сценариев
- Синтаксис в стиле AWK с низким порогом входа
- Богатый набор встроенных функций и переменных
- Поддерживает условную фильтрацию и агрегированную статистику
Установка и настройка bpftrace
Способы установки
Пример
sudo apt install bpftrace
# CentOS/RHEL
sudo yum install bpftrace
# Сборка из исходного кода
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install
Проверка установки
sudo bpftrace -e 'BEGIN { printf("Hello, bpftrace!n"); }'
Базовый синтаксис bpftrace
Программа bpftrace состоит из точек трассировки и связанных действий. Базовая структура выглядит следующим образом:
probe /filter/ {
action
}
Типы точек зондирования
| Тип точки зондирования | Описание | Пример |
|---|---|---|
kprobe |
Вход в функцию ядра | kprobe:vfs_read |
kretprobe |
Возврат из функции ядра | kretprobe:vfs_read |
uprobe |
Вход в функцию пользовательского пространства | uprobe:/bin/bash:readline |
tracepoint |
Статическая точка трассировки ядра | tracepoint:syscalls:sys_enter_open |
interval |
Запуск по таймеру | interval:s:5 |
software |
Программные события | software:faults:major |
Общие встроенные переменные
pid: ID текущего процессаtid: ID текущего потокаcomm: Имя текущего процессаnsecs: Метка времени в наносекундахarg0-argN: Аргументы функцииretval: Возвращаемое значение функции
Практические примеры bpftrace
1. Трассировка системных вызовов
Пример
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'
2. Анализ времени выполнения функции
Пример
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@times = hist(nsecs - @start[tid]);
delete(@start[tid]);
}'
3. Мониторинг доступа процессов к файлам
Пример
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'
4. Подсчёт TCP-соединений
Пример
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'
Расширенные возможности bpftrace
1. Функциональность карт
bpftrace предоставляет разнообразные встроенные типы карт для агрегирования данных:
Пример
@hist = hist(nsecs);
# Вычислить среднее
@avg = avg(nsecs);
# Подсчитать уникальные значения
@unique = count();
2. Условная фильтрация
Пример
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
printf("PID %d reading %d bytesn", pid, args->count);
}
3. Комбинирование нескольких проб
Пример
kprobe:sock_alloc {
@socket[tid] = 1;
}
kprobe:tcp_connect /@socket[tid]/ {
printf("socket %d connecting to %s:%dn", args->sock->__sk_common.skc_dport,
ntop(args->sock->__sk_common.skc_daddr),
args->sock->__sk_common.skc_dport);
delete(@socket[tid]);
}
Лучшие практики bpftrace
- Ограничьте область трассировки: Используйте фильтрацию по PID или имени команды, чтобы снизить нагрузку на систему
- Избегайте избыточного вывода: Слишком много вызовов printf может повлиять на производительность
- Используйте агрегацию: Используйте count(), sum() и другие агрегатные функции, когда это возможно
- Очищайте ресурсы: Долго работающие скрипты должны периодически очищать данные map
- Вопросы безопасности: bpftrace требует прав root; будьте осторожны при запуске неизвестных скриптов
Сравнение bpftrace с другими инструментами
| Инструмент | Преимущества | Недостатки |
|---|---|---|
| bpftrace | Гибкий, высокопроизводительный, простой в использовании | Требует прав root |
| strace | Простой, не требует компиляции | Высокие накладные расходы |
| perf | Всеобъемлющие возможности, низкие накладные расходы | Крутая кривая обучения |
| SystemTap | Мощный | Требуется компиляция, сложная конфигурация |
Рекомендуемые учебные ресурсы
- Официальная документация bpftrace
- Руководство по однострочным командам bpftrace
- Репозиторий примеров bpftrace
bpftrace — мощный инструмент для анализа производительности системы и устранения неполадок. Практикуя эти примеры и осваивая его основные концепции, вы сможете глубже понять поведение системы Linux во время выполнения и оптимизировать её.
Другие расширения
Справочник команд Linux