strace: что это, команды и дебаг Linux-процессов | Глоссарий FREEHOSTING

strace

strace System Call Tracer
strace — strace — Linux-утилита для трассировки системных вызовов и сигналов процесса. Показывает, какие файлы открываются, какие сетевые соединения устанавливаются, на что процесс тратит время и где зависает. Базовый инструмент диагностики производительности и багов.

Определение простыми словами

strace перехватывает каждый системный вызов, который процесс делает к ядру: open, read, write, connect, futex и сотни других. По выводу видно, что именно делает программа в каждый момент: куда лезет, какие файлы не находит, на каком вызове блокируется. Это позволяет за минуты понять причину «висит и не пишет в лог» или «работает медленно без видимых причин».

strace удобен, когда логов недостаточно или нет вовсе. В паре с htop и perf закрывает большинство задач системного дебага.

Сравнение

Инструмент Что трассирует Накладные расходы Когда выбрать
strace Системные вызовы Высокие (10x–100x) Зависания, отказы, дебаг I/O
ltrace Вызовы библиотек Высокие Анализ работы с libc, libssl
perf CPU-семплирование Низкие (3–5%) Профилирование под нагрузкой
bpftrace Произвольные точки ядра/юзерспейса Низкие Точечная диагностика без рестарта

Кейсы использования

  • Поиск отсутствующих файлов: strace -e openat php сразу показывает, какие конфиги и библиотеки PHP не находит.
  • Замер времени системных вызовов: strace -c -p PID даёт сводку по типу вызова и кумулятивному времени.
  • Дебаг сетевых проблем: strace -e network ловит connect, sendto, recvfrom и таймауты к внешним сервисам.
  • Поиск зависания процесса: одна команда strace -p PID показывает, на каком futex или read процесс висит.
  • Негативный кейс: запускают strace на горячем процессе nginx в проде — производительность падает в 50 раз, метрики SLA проседают на минуты.
  • Негативный кейс: трактуют каждый EAGAIN и ENOENT как баг, хотя в норме программа их обрабатывает.

Технические детали

# Запустить процесс под strace и сохранить лог
strace -tt -T -o app.trace -f ./myapp

# Прицепиться к работающему процессу
strace -p $(pgrep -n nginx) -f -e trace=network

# Сводка: сколько вызовов и времени
strace -c -p PID
# выйти Ctrl+C — увидеть таблицу

# Поиск только open/openat/stat
strace -e trace=openat,stat -f -p PID 2>&1 | grep ENOENT

# strace + grep по файлам конфигурации
strace -e openat php -v 2>&1 | grep \.ini

Частые вопросы

Можно ли запускать strace в продакшене?

С большой осторожностью и на короткое время. strace замедляет процесс в десятки раз. Лучше прицепиться к одному воркеру (-p PID), отфильтровать вызовы (-e trace=...) и сразу отключиться. Для долгой диагностики используйте perf или bpftrace.

Чем strace отличается от perf?

strace перехватывает каждый системный вызов и подходит для дебага логики и I/O. perf делает CPU-семплирование с минимальными накладными расходами и подходит для профилирования под нагрузкой. Это разные инструменты под разные задачи.

Как понять, что процесс завис на чтении?

Запустите strace -p PID. Если процесс висит на вызове read, recvfrom или futex без вывода — это блокировка. Колонка с дескриптором подскажет, какой файл или сокет ожидается.