Определение простыми словами
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 без вывода — это блокировка. Колонка с дескриптором подскажет, какой файл или сокет ожидается.