Библиотека — Linux — справочник команд: фреймворки трассировки [X]
Шифр
linux-tldr-tracing
Разделы
cheatsheet linux tooling
Сверено
2 сентября — в этот день утверждения статьи сверялись с первоисточниками, а не правился текст
Объём
5 675 знаков · 9 разделов · чтения около 5 минут

Linux — справочник команд: фреймворки трассировки


← Назад к обзору


perf

Главный профилировщик Linux. Семплирование, tracepoints, kprobes, uprobes, аппаратные счётчики.

# Профилирование CPU всей системы, 10 секунд
perf record -ag -- sleep 10
perf report

# Профилирование конкретного процесса с частотой 99 Hz
perf record -F 99 -p 1234 -g -- sleep 30

# Flame graph (через brendangregg/FlameGraph)
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

# Аппаратные счётчики для процесса
perf stat -e cycles,instructions,cache-misses,branch-misses -p 1234 sleep 5

# Tracepoint: все page faults
perf record -e page-faults -ag -- sleep 5

# Kprobe: трассировка конкретной функции ядра
perf probe --add tcp_sendmsg
perf record -e probe:tcp_sendmsg -ag -- sleep 10
perf probe --del tcp_sendmsg

Ftrace

Встроенный трассировщик ядра. Не требует установки, управляется файлами tracefs в /sys/kernel/tracing. Старый путь /sys/kernel/debug/tracing — совместимость: tracefs монтируется туда автоматически, но только если в системе смонтирован debugfs.

# Включить трассировку функции
echo function > /sys/kernel/tracing/current_tracer
echo tcp_sendmsg > /sys/kernel/tracing/set_ftrace_filter
echo 1 > /sys/kernel/tracing/tracing_on
cat /sys/kernel/tracing/trace_pipe
# Ctrl+C, затем:
echo 0 > /sys/kernel/tracing/tracing_on

# Граф вызовов функций
echo function_graph > /sys/kernel/tracing/current_tracer
echo ext4_file_write_iter > /sys/kernel/tracing/set_graph_function

# Быстрый вариант через trace-cmd
trace-cmd record -p function_graph -g ext4_file_write_iter sleep 5
trace-cmd report | head -50

# Трассировка событий (tracepoints)
trace-cmd record -e sched:sched_switch sleep 5
trace-cmd report

bpftrace

Высокоуровневый язык eBPF-трассировки. Awk для трассировки.

# Подсчёт syscall по процессам
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

# Гистограмма задержек read()
bpftrace -e 'tracepoint:syscalls:sys_enter_read { @start[tid] = nsecs; }
  tracepoint:syscalls:sys_exit_read /@start[tid]/ {
    @usecs = hist((nsecs - @start[tid]) / 1000);
    delete(@start, tid);
  }'

# Стеки ядра при block I/O
bpftrace -e 'tracepoint:block:block_rq_issue { @[kstack] = count(); }'

# Трассировка TCP retransmit с IP-адресами
bpftrace -e 'kprobe:tcp_retransmit_skb {
    $sk = (struct sock *)arg0;
    printf("retransmit: %s:%d -> %s:%d\n",
      ntop($sk->__sk_common.skc_rcv_saddr),
      $sk->__sk_common.skc_num,
      ntop($sk->__sk_common.skc_daddr),
      bswap($sk->__sk_common.skc_dport));  // dport big-endian
  }'

# Однострочник: кто читает файлы
# (с bpftrace 0.25 args в tracepoint требует BTF в ядре)
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }'

bpftool 🟢

Управление BPF-программами, картами и ссылками. Диагностика eBPF-подсистемы.

# Список загруженных BPF-программ
bpftool prog list

# Детали конкретной программы (байткод, статистика)
bpftool prog show id 42

# Список BPF-карт (maps)
bpftool map list

# Содержимое карты
bpftool map dump id 15

# Список прикреплённых программ на интерфейсе (XDP/TC)
bpftool net list

# Экспорт программы в JSON (для автоматизации)
bpftool prog list -j

libbpf-tools 🟢

CO-RE (Compile Once — Run Everywhere) инструменты. Скомпилированные бинарники, не требуют Python/BCC. Замена BCC-инструментов.

# Установка (из bcc-tools или libbpf-tools пакета)
# Или сборка из исходников: github.com/iovisor/bcc/tree/master/libbpf-tools

# Те же инструменты, что и BCC, но быстрее запускаются и легче:
biosnoop        # вместо BCC biosnoop.py
tcpconnect      # вместо BCC tcpconnect.py
opensnoop       # вместо BCC opensnoop.py
execsnoop       # вместо BCC execsnoop.py

# Преимущество: нет зависимости от заголовков ядра и Python,
# запуск за миллисекунды вместо секунд

BCC 🔴

Python-обёртка для eBPF. Работает, но компилирует BPF-программы при каждом запуске — медленный старт, требует заголовки ядра.

# Те же инструменты, но через Python
/usr/share/bcc/tools/biosnoop
/usr/share/bcc/tools/tcpconnect

# В Debian/Ubuntu пакет называется bpfcc-tools, а инструменты лежат
# в /usr/sbin с суффиксом: opensnoop-bpfcc, execsnoop-bpfcc

# Для новых задач предпочтительнее libbpf-tools или bpftrace.
# BCC остаётся полезен для кастомных инструментов с Python API.

sar

Исторические данные системной активности. Пакет sysstat собирает их по расписанию — через cron или, на systemd-системах, таймерами sysstat-collect.timer и sysstat-summary.timer.

# CPU за сегодня, каждые 10 минут
sar -u

# Память за сегодня
sar -r

# Сеть за сегодня
sar -n DEV

# Блочные устройства за сегодня
sar -d

# Данные за конкретную дату
sar -u -f /var/log/sysstat/sa25

# Всё сразу за вчера
sar -A -f /var/log/sysstat/sa$(date -d yesterday +%d)

dmesg

Кольцевой буфер ядра. Аппаратные ошибки, OOM, паники, предупреждения драйверов.

# Последние сообщения с человекочитаемыми таймштампами
dmesg -T | tail -30

# Только ошибки и предупреждения
dmesg -T --level=err,warn

# Следить за новыми сообщениями (как tail -f)
dmesg -Tw

# Поиск OOM-событий
dmesg -T | grep -i "out of memory"

# Очистить буфер (требует root)
dmesg -C

Связанные заметки

Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.

Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.