Skip to main content

Cyber AI România

Profilarea proceselor Linux cu perf și FlameGraph: cum identifici funcțiile care consumă CPU

Profilarea cu perf nu înseamnă să urmărești doar procentul CPU afișat de top. Scopul este să afli ce trasee de execuție sunt eșantionate cel mai des și în ce funcții se acumulează timpul procesorului. perf folosește infrastructura perf_events din kernel și poate colecta contoare hardware, evenimente software și call stack-uri, iar rezultatele pot fi analizate cu perf report sau transformate într-un FlameGraph.

Instalează instrumentele potrivite

Pe Ubuntu sau Debian:

sudo apt update
sudo apt install linux-tools-common linux-tools-"$(uname -r)" git

Verifică dacă versiunea instrumentului corespunde kernelului activ:

perf --version
uname -r

Pe Fedora și distribuții RHEL-like:

sudo dnf install perf git

Ubuntu include perf prin pachetele linux-tools, iar instrumentul poate raporta contoare precum cicluri CPU, instrucțiuni și branch-uri. Dacă apare o avertizare privind nepotrivirea cu versiunea kernelului, instalează pachetul corespunzător, nu un binar descărcat dintr-o sursă aleatorie.

Confirmă că problema este legată de CPU

Pentru o aplicație pe care o pornești manual:

perf stat -- ./aplicatie --optiuni

Pentru un proces existent:

sudo perf stat -p PID sleep 30

perf stat adună statistici pentru perioada indicată și poate afișa cycles, instructions, branches, branch-misses și alte evenimente disponibile pe procesor. Aceste valori descriu comportamentul general, dar nu arată singure funcția responsabilă.

Pentru orientare live:

sudo perf top -p PID

Vei vedea simbolurile eșantionate frecvent. Este util pentru o primă verificare, dar o captură salvată este mai ușor de repetat și comparat.

Înregistrează call stack-urile

Pentru o captură de 30 de secunde, la 99 de eșantioane pe secundă:

sudo perf record -F 99 -g \
  -p PID -- sleep 30

Pentru lansarea directă a programului:

sudo perf record -F 99 -g -- \
  ./aplicatie --optiuni

perf record salvează profilul în perf.data. Deschide-l cu:

sudo perf report

perf report afișează datele colectate anterior și permite extinderea call graph-urilor pentru a vedea ce funcții au apelat codul costisitor.

Nu analiza doar coloana cu procentul cel mai mare. O funcție poate apărea frecvent deoarece este comună mai multor trasee, iar cauza reală poate fi funcția aplicației care o apelează repetat.

Repară stack-urile incomplete

Dacă raportul conține multe intrări [unknown] sau stack-uri foarte scurte, aplicația poate fi compilată fără frame pointers. Încearcă DWARF unwinding:

sudo perf record -F 99 \
  --call-graph dwarf \
  -p PID -- sleep 30

perf record acceptă metode precum fp și dwarf pentru colectarea informațiilor necesare call graph-ului. DWARF poate produce fișiere mai mari și un overhead superior, motiv pentru care trebuie testat pe intervale controlate.

Pentru aplicațiile compilate de tine, păstrează simbolurile și frame pointers:

CFLAGS="-O2 -g -fno-omit-frame-pointer"
CXXFLAGS="-O2 -g -fno-omit-frame-pointer"

Fără simboluri, perf poate afișa adrese sau nume incomplete în locul funcțiilor reale.

Generează FlameGraph-ul

Clonează proiectul original:

git clone https://github.com/brendangregg/FlameGraph.git

Transformă profilul în stack-uri text, apoi în formatul compact necesar:

sudo perf script > perf.unfold

./FlameGraph/stackcollapse-perf.pl \
  perf.unfold > perf.folded

./FlameGraph/flamegraph.pl \
  perf.folded > cpu-flamegraph.svg

Fluxul FlameGraph are trei etape: colectarea stack-urilor, compactarea lor cu stackcollapse-perf.pl și randarea într-un fișier SVG cu flamegraph.pl.

Cum interpretezi rezultatul

Lățimea unui dreptunghi arată proporția eșantioanelor în care funcția a apărut, inclusiv activitatea funcțiilor apelate de ea. Axa verticală reprezintă adâncimea stack-ului: apelanții sunt mai jos, iar funcțiile chemate apar deasupra.

FlameGraph-ul nu este o cronologie. Poziția orizontală grupează trasee similare, iar culorile implicite sunt în principal decorative, nu un indicator automat al severității. Caută platouri late în partea superioară: acestea indică funcții în care procesul execută direct multă muncă CPU.

Compară înainte și după optimizare

Creează două capturi în condiții similare:

sudo perf record -F 99 -g \
  -o perf-before.data -p PID -- sleep 30

După modificarea aplicației:

sudo perf record -F 99 -g \
  -o perf-after.data -p PID -- sleep 30

Păstrează aceeași durată, același workload, versiunea kernelului și configurația aplicației. O funcție mai îngustă în al doilea grafic este relevantă numai dacă testele sunt comparabile.

În producție, profilează pe intervale scurte. Accesul utilizatorilor neprivilegiați la evenimentele de performanță este controlat de kernel.perf_event_paranoid; nu reduce permanent restricțiile pe un server comun doar pentru comoditate. Fișierul perf.data trebuie protejat, deoarece poate conține simboluri și detalii despre execuția aplicației.

Surse folosite

Linux manual pages — perf, perf stat, perf record și perf report
Linux Kernel Documentation — securitatea perf_events și perf_event_paranoid
Ubuntu Documentation — instrumente de măsurare și profilare cu perf
Brendan Gregg — FlameGraph și CPU Flame Graphs
Repository-ul oficial FlameGraph — stackcollapse-perf.pl și flamegraph.pl

Facebook
X
WhatsApp

Te-ar putea interesa si: