Команда Linux bpftrace

Linux 命令大全Справочник команд Linux


bpftrace — это продвинутый инструмент трассировки, основанный на eBPF (extended Berkeley Packet Filter). Он позволяет разработчикам динамически наблюдать и анализировать состояние выполнения систем Linux без изменения кода ядра.

eBPF — революционная технология в ядре Linux. Она предоставляет безопасную среду виртуальной машины, которая может выполнять определяемый пользователем код в ядре. bpftrace построен поверх eBPF и предоставляет более простой высокоуровневый слой абстракции.


Основные преимущества bpftrace

Наблюдение за системой в реальном времени

  • Не требуется перезапускать систему или приложения
  • Чрезвычайно низкие накладные расходы на производительность
  • Позволяет наблюдать как программы ядра, так и программы пользовательского пространства

Гибкие возможности зондирования

  • Поддерживает несколько типов точек зондирования: вход/выход из функции, таймеры, аппаратные события и т. д.
  • Позволяет трассировать системные вызовы, сетевые события, дисковый ввод-вывод и т. д.

Простой язык сценариев

  • Синтаксис в стиле AWK с низким порогом входа
  • Богатый набор встроенных функций и переменных
  • Поддерживает условную фильтрацию и агрегированную статистику

Установка и настройка bpftrace

Способы установки

Пример

# Ubuntu/Debian
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. Трассировка системных вызовов

Пример

# Подсчёт количества системных вызовов open
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'

2. Анализ времени выполнения функции

Пример

# Измерить время выполнения vfs_read
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-соединений

Пример

# Подсчёт 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

  1. Ограничьте область трассировки: Используйте фильтрацию по PID или имени команды, чтобы снизить нагрузку на систему
  2. Избегайте избыточного вывода: Слишком много вызовов printf может повлиять на производительность
  3. Используйте агрегацию: Используйте count(), sum() и другие агрегатные функции, когда это возможно
  4. Очищайте ресурсы: Долго работающие скрипты должны периодически очищать данные map
  5. Вопросы безопасности: bpftrace требует прав root; будьте осторожны при запуске неизвестных скриптов

Сравнение bpftrace с другими инструментами

Инструмент Преимущества Недостатки
bpftrace Гибкий, высокопроизводительный, простой в использовании Требует прав root
strace Простой, не требует компиляции Высокие накладные расходы
perf Всеобъемлющие возможности, низкие накладные расходы Крутая кривая обучения
SystemTap Мощный Требуется компиляция, сложная конфигурация

Рекомендуемые учебные ресурсы

  1. Официальная документация bpftrace
  2. Руководство по однострочным командам bpftrace
  3. Репозиторий примеров bpftrace

bpftrace — мощный инструмент для анализа производительности системы и устранения неполадок. Практикуя эти примеры и осваивая его основные концепции, вы сможете глубже понять поведение системы Linux во время выполнения и оптимизировать её.


Linux 命令大全Справочник команд Linux

Другие расширения