strace и perf: шпаргалка по устранению неполадок в Linux
13 мин чтения - 4 июня 2026 г.

Когда использовать strace против perf в Linux, какие команды вы будете выполнять на самом деле и как снизить накладные расходы при отладке загруженного производственного сервера.
strace и perf для устранения неполадок в Linux
Когда сервер Linux работает медленно, вылетает или перегружает процессор, а журналы приложений не объясняют причину, два инструмента помогают устранить большинство неполадок. strace показывает, что именно процесс запрашивает у ядра. perf показывает, на что уходит время процессора. Вместе они отвечают на вопросы «почему система зависла» и «что она делает», с которыми ничто другое не справляется так просто.
В этой статье рассказывается, когда следует использовать каждый из этих инструментов, как их установить, какие команды вам понадобятся на практике и как свести к минимуму нагрузку на рабочий сервер.
Когда использовать strace, а когда perf
Отличие простое. Используйте perf , когда процессор загружен, и вам нужно узнать, какая функция за это отвечает. Используйте strace , когда процесс зависает, вылетает, возвращает странные ошибки или ведет себя так, как не объясняют логи.
perf производит выборку данных из аппаратных счетчиков ядра с настраиваемой частотой, поэтому накладные расходы обычно составляют менее 1%, и его можно безопасно запускать в производственной среде. strace перехватывает каждый системный вызов через ptrace, что может замедлить целевой процесс в 10–100 раз. Используйте его в рабочих системах с осторожностью и всегда с фильтрами.
| Симптом | Начните с | Далее |
|---|---|---|
| Высокая загрузка ЦП | perf top или perf record -g | strace -c на «горячем» процессе |
| Медленная работа диска или ожидание ввода-вывода | perf stat из-за промахов кэша | strace -e trace=file |
| Зависание процесса или скрытая ошибка | strace -e trace=file,network | perf stat для исключения перегрузки ЦП |
| Конфликт блокировок или медленная работа API | strace -c, обратите внимание на futex | perf record -g |
Установка strace и perf
Оба инструмента находятся в стандартных репозиториях. strace использует ptrace syscall, который уже много лет входит в состав каждого современного ядра. perf использует perf_events интерфейс и требует пакета, соответствующего вашему ядру.
sudo apt install strace linux-tools-common linux-tools-$(uname -r)
sudo dnf install strace perf
Бит $(uname -r) значение имеет разрядность. Бинарник perf, скомпилированный под другую версию ядра, выдает запутанный вывод и может незаметно пропускать события. Проверьте с помощью perf --version и strace -V после установки.
Чтобы perf отображал имена функций вместо шестнадцатеричных адресов, вам нужны отладочные символы. Установите соответствующий -dbg или -debuginfo (например, libc6-dbg в Debian) и скомпилируйте собственные бинарники с помощью -g в GCC.
Внутри контейнеров strace требуется --cap-add=SYS_PTRACE и perf необходимо --cap-add=SYS_ADMIN при запуске с помощью Docker. Без этих ограничений инструменты выходят из строя, что выглядит как ошибки.
Отслеживание системных вызовов с помощью strace
Запуск strace command trace отслеживает процесс с момента запуска. Чтобы присоединиться к запущенному процессу, используйте strace -p PID. Для любых многопоточных процессов или тех, которые создают дочерние процессы, добавьте -f для отслеживания дочерних процессов, иначе вы пропустите большую часть активности.
Строки вывода заканчиваются возвращаемым значением. -1 ENOENT означает, что файла, запрошенного процессом, нет. -1 EACCES означает проблемы с правами доступа. Эти две ошибки сами по себе составляют удивительно большую долю производственных ошибок.
Самый полезный флаг — -e trace=GROUP, который ограничивает вывод результатов по указанной категории системных вызовов и позволяет контролировать объем информации.
| Группа | вызовов | Для чего это нужно |
|---|---|---|
file | openat, stat, read, write | Отсутствующие конфигурации, ошибки прав доступа, медленный ввод-вывод |
network | socket, connect, bind, recvfrom | Отказ в подключении, сбои DNS, проблемы с TLS |
process | execve, clone, wait4 | Сбои, шквал процессов, отсутствующие бинарные файлы |
futex | futex | Конфликты блокировок и остановки потоков |
На загруженном сервере начните с strace -c -p PID на десять или двадцать секунд. Флаг -c флаг выводит сводку количества системных вызовов, общего времени и ошибок при отсоединении. Это позволяет определить, на какую категорию стоит обратить особое внимание, не перегружая терминал. Затем подключитесь снова с узким фильтром.
Другие флаги, о которых стоит знать: -T регистрирует время, затраченное на каждый вызов, -Z показывает только неудачные вызовы, и -o file записывает в лог вместо терминала, что работает намного быстрее при загруженном процессе.
Профилирование ЦП с помощью perf
В perf есть четыре команды, которые вы будете использовать чаще всего.
| Команда | Что она делает | Распространенные флаги |
|---|---|---|
perf stat | Снимок счетчиков: циклы, промахи кэша, переключения контекста | -e, -p, -a |
perf top | Динамический просмотр наиболее загруженных функций в системе | --sort comm,dso,symbol |
perf record | Захват выборок для perf.data для офлайн-анализа | -F, -g, -p |
perf report | Считывает perf.data, ранжирует функции по доле в выборке | --stdio, --sort |
Начните с perf stat -p PID для быстрого обзора. Цифры, на которые следует обратить внимание:
- IPC (количество инструкций за такт) ниже 1,0: ЦП задерживается, обычно при доступе к памяти.
- Высокое количество промахов при загрузке LLC: рабочий набор не помещается в кэш, поэтому процессор ожидает ответа от ОЗУ.
- Высокое количество переключений контекста: классический признак для рабочих нагрузок, ограниченных вводом-выводом, где потоки постоянно блокируются на диске или в сети.
Если что-то выглядит не так, проверьте perf record -F 99 -g -p PID -- sleep 30. -F 99 выполняет выборку с частотой 99 Гц, чего достаточно для поиска «горячих» функций и позволяет избежать синхронизации с таймером ядра при круглых значениях, таких как 100 Гц. Флаг -g Флаг фиксирует графы вызовов, поэтому perf report может показать, какие пути входа в функцию являются виновными.
В perf reportстолбце «Накладные расходы» указана доля от общего числа выборок. Высокие накладные расходы в _int_malloc или memcpy означает интенсивное выделение памяти. Высокие накладные расходы в одной из ваших собственных функций — это и есть тот «горячий» участок, который вы искали.
Если вместо имен функций вы видите шестнадцатеричные адреса, это означает, что бинарный файл очищен или отсутствуют отладочные символы. Установите соответствующий -dbg пакет или пересоберите бинарник с -g.
Практический рабочий процесс на действующем сервере
В случае реального инцидента на загруженном сервере процедура выглядит следующим образом:
- Сначала подтвердите симптом с помощью простых инструментов:
top,vmstat,iostat. Если вы работаете на виртуальной машине, проверьте столбецstстолбец (steal). Любое значение выше 5% означает, что узким местом является гипервизор, а не ваш код. - Если загрузка ЦП высокая, запустите
perf topна несколько секунд, а затемperf record -F 99 -g -p PID -- sleep 30для проблемного процесса. 30-секундный захват при частоте 99 Гц дает около 1,7 МБ данных. - Если процесс завис, работает медленно или возвращает ошибки, запустите
strace -c -p PIDв течение десяти секунд и прочитайте сводку. Если доминирует одна категория системных вызовов, сузьте поиск с помощьюstrace -e trace=GROUP -T -p PID. - Когда вы найдете подозрительный системный вызов или функцию, отсоединитесь. Не оставляйте ни один из инструментов работающим в производственной среде дольше, чем это необходимо.
Два предостережения. strace Вывод может содержать переменные среды, пути к файлам и байты, прочитанные из сокетов, поэтому очищайте журналы перед передачей их за пределы вашей команды. А если вы собираетесь делать это регулярно, в качестве следующего шага обратите внимание на bpftrace и более широкий набор инструментов eBPF в качестве следующего шага: такая же видимость, накладные расходы менее 1%, созданный для производственной среды с самого начала.
Если вы выполняете рабочие нагрузки, где важен глубокий диагностический доступ, а совместное использование инфраструктуры не является вариантом, ознакомьтесь с нашими выделенными серверами.

В стандартную комплектацию VPS от FDC входят диски NVMe, процессоры EPYC и действительно неизмеряемая пропускная способность. Готовы к обновлению?
Разблокируйте производительность прямо сейчасПочему важно иметь мощный и не тарифицируемый VPS
Неизмеряемый VPS предоставляет пропускную способность по фиксированной ставке при фиксированной скорости порта. Чем он отличается от дозированных тарифных планов, когда он окупается и что нужно проверить перед покупкой.
7 мин чтения - 9 мая 2025 г.
Управление памятью в Linux: Подкачка, убийца OOM и Cgroups
12 мин чтения - 31 мая 2026 г.

У вас есть вопросы или вам нужно индивидуальное решение?
Гибкие варианты
Глобальный охват
Мгновенное развертывание
Гибкие варианты
Глобальный охват
Мгновенное развертывание