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

Коли використовувати strace vs 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)
На RHEL, AlmaLinux або Fedora:
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 відстежує процес від моменту запуску. Щоб підключитися до запущеного процесу, використовуйте 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: Swap, OOM Killer та Cgroups
12 хв читання - 31 травня 2026 р.

Маєте запитання або потребуєте індивідуального рішення?
Гнучкі варіанти
Глобальне охоплення
Миттєве розгортання
Гнучкі варіанти
Глобальне охоплення
Миттєве розгортання