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
Связанные заметки
- Linux — средства диагностики производительности — обзорная карта инструментов
- Linux — мониторинг и отладка — когда и зачем применять трассировку
- Linux — справочник команд: приложения и системные вызовы — уровень выше по стеку
Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.
Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.