strace: трассировка системных вызовов на практике

Рейтинг: 71.7% · 16 голосов
Подробный курс по диагностике и производительности Linux для админов и DevOps: с чего начать, методология USE, логи (journalctl, dmesg), процессы, CPU, память и OOM, диск и IO (iostat), сеть (ss, tcpdump), системные вызовы и strace, ltrace, perf, флеймграфы, ftrace, eBPF и bpftrace, lsof, мониторинг. Разбор каждого инструмента с чтением вывода.
Ответить
Аватара пользователя
Dmitry_SRE
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

strace: трассировка системных вызовов на практике

Сообщение Dmitry_SRE »

Оглавление курса (47)
  1. С чего начать диагностику Linux: методология вместо паники
  2. Первые 60 секунд: экспресс-диагностика нагруженного сервера
  3. Методологии диагностики: USE, RED и здравый смысл
  4. Логи systemd через journalctl: где искать причину
  5. Где лежат логи Linux: /var/log, dmesg и rsyslog
  6. Источники правды: load average, /proc и /sys
  7. Процессы Linux: ps, pstree и состояния процессов
  8. Интерактивный мониторинг: top и htop
  9. Метрики процессов во времени: pidstat
  10. Приоритеты и ограничения: nice, ionice, cgroups
  11. Сигналы и зависшие процессы: kill, и что делать с D-state
  12. Загрузка CPU: user, system, iowait, steal и контекст-свитчи
  13. Диагностика CPU по ядрам: vmstat и mpstat
  14. Профилирование CPU: perf top и поиск пожирателя
  15. Частоты, троттлинг и NUMA: turbostat и numastat
  16. Память Linux: RSS, VSZ, page cache и миф о нехватке памяти
  17. Сколько памяти занято: free, /proc/meminfo и vmstat
  18. Поиск утечек и пожирателей памяти: smem, pmap, smaps
  19. Swap и подкачка: swapon, swappiness, когда своп - это боль
  20. OOM killer: кто и за что убил процесс
  21. Память ядра и slab: slabtop и куда уходит RAM
  22. Подсистема ввода-вывода: путь запроса от приложения до диска
  23. Диагностика диска: iostat и чтение await, %util
  24. Кто грузит диск: iotop и атрибуция io процессам
  25. Файловые системы: df, du, иноды и куда делось место
  26. Глубокая диагностика блочного слоя: blktrace и biolatency
  27. Кеш страниц и грязные данные: dirty pages, fsync, drop_caches
  28. Сетевой стек Linux: путь пакета и где возникают задержки
  29. Сокеты и соединения: ss и netstat
  30. Захват трафика: tcpdump для диагностики сети
  31. Задержки и потери в сети: ping, mtr, диагностика латентности
  32. Сеть как источник проблем: nftables, conntrack, дропы
  33. Что такое системный вызов и зачем его трассировать
  34. strace: трассировка системных вызовов на практике (вы здесь)
  35. strace в бою: почему программа висит, падает или тормозит
  36. ltrace: трассировка вызовов библиотек
  37. Накладные расходы трассировки и безопасные альтернативы
  38. perf: универсальный профайлер Linux
  39. Флеймграфы: визуализация профиля производительности
  40. Трассировка ядра: ftrace и trace-cmd
  41. eBPF: революция в наблюдаемости Linux
  42. Инструменты eBPF на практике: BCC и bpftrace
  43. lsof: открытые файлы, дескрипторы, кто держит файл и порт
  44. Разбор кейса: приложение тормозит - пошаговая диагностика
  45. Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix
  46. Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes
  47. Карта инструментов и сквозной разбор инцидента производительности
Бывало так: программа запускается, но молча падает. Или висит и ничего не пишет в лог. Или ругается "permission denied", а ты в упор не видишь, к какому файлу у неё нет прав. Логи пустые, разработчик в отпуске, а чинить надо сейчас. Вот ровно в этот момент тебя спасает strace - инструмент, который показывает, что программа РЕАЛЬНО делает на уровне ядра, а не то, что она про себя думает в логах.

Это один из самых частых запросов у админов: strace linux, strace примеры, как присоединиться к процессу. Запрос strace 1319 (это просто пример PID процесса) - классика жанра, когда человек гуглит, как прицепиться к работающему демону. Разберём strace с нуля и доведём до боевого набора опций, чтобы ты после урока мог открыть терминал и сам прочитать вывод. Сразу пометка: на 2026 год strace - всё ещё базовый инструмент, но для горячего прода у него появилась серьёзная замена в лице eBPF, и про это мы тоже поговорим.

Что такое системный вызов и зачем тут strace

Любая программа сама по себе мало что может. Открыть файл, прочитать байты, отправить пакет в сеть, выделить память, запустить другой процесс - всё это делает не программа, а ядро Linux по её просьбе. Эти "просьбы" и называются системными вызовами (syscalls). Программа как посетитель в банке: сама в сейф не лезет, а пишет заявки в окошко, и кассир (ядро) их выполняет.

strace - это камера, которая снимает все заявки в это окошко. Технически он делает это через системный вызов ptrace(2): ядро останавливает отслеживаемый процесс на каждом syscall и отдаёт strace его аргументы и результат. Команда strace показывает поток системных вызовов: имя вызова, его аргументы и результат. Ты буквально видишь, какие файлы программа пытается открыть, по каким путям лезет, к какому сокету подключается и где спотыкается. Поэтому говорят, что strace - это шпаргалка к тому, что софт делает на самом деле, без догадок.

Важно сразу понимать границу: strace отлично ловит обращения к файлам, сети, процессам и сигналам. Но из-за ptrace он замедляет программу в разы (каждый syscall - это два переключения контекста туда-обратно) и не показывает, что творится ВНУТРИ процесса между вызовами - там уже нужен perf или gdb. Для прода это значит: не вешай обычный strace надолго на нагруженный демон, иначе уронишь ему latency.

Изображение

Базовый запуск: strace команда и strace -p PID

Есть два способа. Первый - запустить программу под наблюдением:

Код: Выделить всё

strace ls /tmp
Второй, самый ценный на практике, - прицепиться к уже работающему процессу по его PID. Это и есть тот самый strace -p, который все ищут:

Код: Выделить всё

sudo strace -p 1319
Здесь 1319 - PID процесса (узнать его можно через ps aux | grep имя, pidof nginx или pgrep -f). Нужен sudo, если процесс чужой или системный. Отцепиться - Ctrl+C, программа продолжит работать как ни в чём не бывало (strace аккуратно отпускает ptrace).

Теперь учимся читать вывод. Каждая строка - один системный вызов. Возьмём реальный пример:

Код: Выделить всё

openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
read(3, "127.0.0.1 localhost\n", 4096)   = 20
close(3)                                 = 0
Разбираем по частям. openat - имя вызова (открыть файл). В скобках - аргументы: первый AT_FDCWD означает "путь считать от текущего каталога", дальше путь "/etc/hosts" и флаги O_RDONLY|O_CLOEXEC (только чтение, закрыть при exec). После знака = идёт результат: число 3 - это файловый дескриптор (fd), грубо говоря, "номерок", по которому дальше идёт работа с файлом (0, 1, 2 заняты под stdin/stdout/stderr, поэтому первый свободный обычно 3). Следующая строка read(3, ...) читает из дескриптора 3, и = 20 значит "прочитано 20 байт". close(3) = 0 - закрыли, ноль означает успех. Логика простая: положительное число или 0 после = это обычно успех, а -1 это ошибка.

Главные опции strace и чтение ошибок

Несколько флагов делают strace по-настоящему рабочим. Запомни их как набор по умолчанию:
  • -f - следить за дочерними процессами и потоками (форками). Нужен почти всегда: без него ты увидишь только главный процесс, а вся работа часто уходит в потомков и воркеры.
  • -e trace=... - фильтр вызовов. Группы на 2026 пишутся с префиксом %: -e trace=%file (всё про пути к файлам), -e trace=%network или %net (сеть), -e trace=%process (форки и exec), -e trace=%desc (работа с дескрипторами), -e trace=%memory. Старая запись без % (trace=file) пока работает как синоним, но рекомендуемая форма - с процентом. Или поимённо: -e trace=openat,read,write.
  • -o файл - писать вывод в файл, а не в терминал. Незаменимо, когда вызовов тысячи: strace -o /tmp/trace.log -p 1319.
  • -s 200 - длина показываемых строк-аргументов. По умолчанию strace обрезает строки до 32 символов, и ты не видишь полный путь или тело запроса. Ставь -s 200, чтобы видеть больше. На свежих версиях (strace 6.10+, 2024) можно вообще снять лимит: -s inf.
  • -y (он же --decode-fds) - показывать рядом с дескриптором его настоящий путь. Вместо голого read(3, ...) увидишь read(3</etc/hosts>, ...). Двойной -yy раскрывает ещё и сокеты с протоколом и адресом - очень помогает не держать в голове, какой fd что значит.
  • -p PID - прицепиться к процессу (разбирали выше). Можно указать несколько: -p PID1 -p PID2.
  • -t / -tt - добавить отметку времени в начало строки (-tt с микросекундами), -T - показать, сколько длился каждый вызов. Незаменимо, когда ищешь, на чём именно процесс залип.
Боевая команда, которую не стыдно вставить в чек-лист:

Код: Выделить всё

sudo strace -f -yy -s 200 -T -e trace=%file -o /tmp/trace.log -p 1319
Отдельно про новые фильтры по статусу (strace 5.2+): -z покажет только успешные вызовы, -Z - только упавшие. Когда ищешь именно проблему, -Z экономит кучу глаз:

Код: Выделить всё

sudo strace -f -Z -e trace=%file -p 1319
Теперь самое полезное для диагностики - ошибки. Когда после = стоит -1, дальше идёт символьное имя ошибки (errno) и расшифровка:

Код: Выделить всё

openat(AT_FDCWD, "/etc/app/config.yml", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/var/log/app.log", O_WRONLY) = -1 EACCES (Permission denied)
read(7, 0x7ffd..., 4096)               = -1 EAGAIN (Resource temporarily unavailable)
Как это читать:
  • ENOENT - файла или каталога нет по этому пути. Самая частая причина "программа не стартует": лезет за конфигом не туда. Решение видно прямо в строке - вот точный путь, который она ждёт. Лайфхак: strace -f -e trace=%file ./app 2>&1 | grep ENOENT моментально выдаёт список всего, что программа искала и не нашла.
  • EACCES - путь есть, но нет прав. Смотри владельца и режим файла (ls -l), от какого пользователя запущен процесс. Типичная история с правами на лог, сокет или каталог. Не путай с EPERM (часто это уже про привилегии/capabilities или ограничение seccomp/SELinux).
  • EAGAIN (то же, что EWOULDBLOCK) - "пока нечего, попробуй позже". На неблокирующих сокетах это норма, а не ошибка: программа спрашивает данные, их ещё нет, она повторит. Рядом часто видно EINPROGRESS на connect - это тоже рабочий фон асинхронной сети. Пугаться одиночных EAGAIN не надо.
Отдельно полезен режим сводки -c: он не печатает каждый вызов, а в конце выдаёт таблицу - сколько раз какой syscall дёрнули и сколько в нём провели времени.

Код: Выделить всё

sudo strace -f -c -p 1319
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 61.2    0.184523          18     10240       512 read
 22.4    0.067610          33      2048           write
  9.1    0.027400         534        51        51 connect
Колонки слева направо: доля времени, суммарное время, микросекунды на вызов, число вызовов, число ошибок, имя вызова. Если в строке read огромное число calls и куча errors - вот где программа крутится впустую. В примере выше у connect 51 вызов и 51 ошибка: 100% соединений падают - вот это уже точно проблема, а не фон. Это первый намёк, куда копать.

2026: где strace уступил место eBPF

Это главное обновление урока. strace построен на ptrace и тормозит цель в разы - на горячем демоне с десятками тысяч syscall в секунду это опасно. Поэтому в 2026 для прода стандарт сместился к eBPF: ядро инструментирует точки вызова напрямую, без остановки процесса, и накладные расходы near-zero.
  • opensnoop / opensnoop-bpfcc (из пакета bpfcc-tools) или opensnoop.bt (bpftrace) - то же самое, что strace -e trace=%file для отлова открытий файлов, но почти бесплатно по нагрузке. Идеально, когда надо понять, какой конфиг ищет сервис, не трогая его latency.
  • execsnoop - ловит запуск новых процессов (execve) по всей системе. Незаменимо, когда сервис спавнит дочерние команды и они мгновенно умирают - обычным strace такое поймать сложно.
  • bpftrace - однострочники под любую задачу. Например, посчитать syscall конкретного процесса: bpftrace -e 'tracepoint:raw_syscalls:sys_enter /pid == 1319/ { @[args.id] = count(); }'.
Если eBPF-инструментов под рукой нет, а strace всё же надо повесить на нагруженный процесс, спасает родной режим самого strace: флаг --seccomp-bpf (с версии 5.3). Он через seccomp-фильтр останавливает процесс ТОЛЬКО на тех вызовах, что ты выбрал в -e trace=, а не на всех подряд - и overhead падает в разы:

Код: Выделить всё

sudo strace -f --seccomp-bpf -e trace=%network -p 1319
Правило на 2026: точечная разовая диагностика на тесте или ненагруженном сервисе - strace; постоянное наблюдение или горячий прод - eBPF (opensnoop/execsnoop/bpftrace) либо strace с --seccomp-bpf.

Типичные грабли и заблуждения
  • Забыл -f. Снимаешь nginx или Apache, видишь почти пустоту и думаешь "ничего не делает". А вся работа в воркерах-потомках. Без -f их не видно.
  • Строки обрезаны. Видишь "..." в аргументах и не понимаешь полный путь. Добавь -s 200 (или -s inf на свежих версиях).
  • Путаешь EAGAIN с поломкой. На сетевых демонах EAGAIN, EWOULDBLOCK и EINPROGRESS - рабочий фон, а не авария. Авария - это когда ошибок 100% и процесс не движется.
  • Вешаешь обычный strace на горячий прод надолго. ptrace тормозит процесс заметно. На нагруженной базе это может уронить latency. Бери -c для сводки, --seccomp-bpf для точечного фильтра или вообще eBPF.
  • Ждёшь от strace внутренностей. Он показывает границу "программа - ядро", но не логику внутри функций. Чтобы увидеть, в каком коде застрял вызов, собери стек: strace -k (нужен strace, собранный с libunwind, и бинарь с отладочными символами).
На Astra Linux и RED OS strace ставится из штатных репозиториев (apt install strace или dnf install strace) и работает так же - это стандартная утилита. Пакет eBPF-инструментов там называется bpfcc-tools или bcc-tools, плюс bpftrace отдельным пакетом.

Мини-лаба: попробуй прямо сейчас
  • Запусти strace ls /etc и найди в выводе вызовы openat - посмотри, какие библиотеки (.so) и файлы открывает даже простая ls перед стартом.
  • Сделай strace -e trace=openat cat /nonexistent и найди строку с -1 ENOENT. Это эталон "файла нет".
  • Поймай только ошибки: strace -Z ls /root /nope /etc 2>&1 - сравни, что strace отфильтровал.
  • Возьми реальный сервис: pidof sshd (или nginx), затем sudo strace -f -yy -s 200 -p ВЫБРАННЫЙ_PID. Поработай с сервисом и смотри, какие файлы и сокеты он дёргает. Отцепись по Ctrl+C.
  • Сними сводку: sudo strace -f -c -p PID на 10-15 секунд и найди самый частый syscall и строку с максимумом errors.
  • Если есть bpfcc-tools: запусти sudo opensnoop-bpfcc в одном окне, поработай системой в другом - сравни ощущение с strace по нагрузке.
Контрольные вопросы
  • Чем отличается запуск strace команда от strace -p PID и когда нужен второй вариант?
  • Что значит результат = -1 ENOENT и куда смотреть дальше при такой ошибке? Чем она отличается от EACCES?
  • Зачем почти всегда добавляют флаг -f и что будет без него при трассировке nginx?
  • Почему обычный strace опасно вешать на горячий прод и какие есть три обходных пути на 2026 год?
Что запомнить. strace показывает реальные заявки программы к ядру: вызов, аргументы, = результат. -1 и errno (ENOENT, EACCES, EAGAIN) сразу подсказывают причину сбоя. Рабочий набор - -f -yy -s 200 -e trace=%file -o файл, -c даёт быструю сводку, -Z отсеивает только ошибки. Это первый инструмент, когда программа "молчит, но не работает". Но на нагруженном проде в 2026 предпочитай eBPF (opensnoop, execsnoop, bpftrace) или strace --seccomp-bpf - меньше боли для latency.
👍2 ❤️ 🔥1 😄 🤔1
Аватара пользователя
ray3332
Сообщения: 1
Зарегистрирован: 04 июн 2026, 14:05

Re: strace: трассировка системных вызовов на практике

Сообщение ray3332 »

Спасибо, наконец дошло зачем -y. Раньше сидел и вручную сопоставлял какой fd какой файл, а тут strace -p 1319 -yy и сразу пути и сокеты рядом. Сэкономили кучу времени.
👍 ❤️ 🔥2 😄 🤔
Аватара пользователя
kt320521
Сообщения: 1
Зарегистрирован: 13 май 2026, 09:15

Re: strace: трассировка системных вызовов на практике

Сообщение kt320521 »

Вот про eBPF прям в тему. Повесил strace на боевой nginx под нагрузкой и чуть не положил latency. Теперь юзаю opensnoop и --seccomp-bpf, спасибо что предупредили про ptrace.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Что такое системный вызов и зачем его трассировать
Следующая глава →
strace в бою: почему программа висит, падает или тормозит

Все главы курса «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Поделиться темой: ✈ Telegram VK
Похожие запросы: strace почему программа висит и тормозитчто такое системный вызов и зачем трассироватьМониторинг и метрики nginxЛоги nginx: access_log и JSON

Вернуться в «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость