Profiler — dastur ishlashi davomida CPU vaqti, xotira, allocation, I/O, lock, call stack yoki boshqa performance ko‘rsatkichlarini o‘lchaydigan vosita.
Profiler dasturning qaysi qismi ko‘p resurs sarflayotganini faktlar asosida ko‘rsatadi. Taxmin asosida optimization qilish o‘rniga real bottleneck aniqlanadi.
Profiling development, test va ehtiyotkor sozlama bilan production muhitida bajarilishi mumkin.
CPU profiling
CPU profiler process va functionlar qancha CPU vaqt ishlatganini o‘lchaydi.
Natijalar:
CPU 100% bo‘lmasa ham bitta request sekin bo‘lishi mumkin. Wall-clock va I/O profiling ham kerak.
Instrumentation
Profiler function kirish-chiqishiga code qo‘shadi.
Afzalligi:
- aniq call count;
- function duration;
- call graph.
Kamchiligi:
- katta overhead;
- timing o‘zgarishi;
- har functionni instrument qilish hajmi.
Selective instrumentation overheadni kamaytiradi.
Sampling
Profiler ma’lum intervalda thread qaysi instruction yoki stackda ekanini sample qiladi.
Agar function CPU vaqtining 40%ini ishlatsa, sample’larning taxminan 40%ida ko‘rinadi.
Afzalliklari:
- pastroq overhead;
- productionga mosroq;
- native va managed stack.
Kamchiligi — juda qisqa eventlar kam sample olinishi mumkin.
Sampling frequency
Frequency yuqori bo‘lsa aniqlik oshadi, overhead ham ortadi.
Past frequency uzoq profil uchun qulay.
Profiler signal, hardware performance counter yoki timer interruptdan foydalanishi mumkin.
Self time va total time
Self time functionning o‘z code’ida sarflangan vaqt.
Total time function va uning child chaqiriqlaridagi vaqt.
Misol:
handle_request total 500 ms
handle_request self 20 ms
database_query 450 ms
Bottleneck database’da, handler body’sida emas.
Call graph
Call graph qaysi function qaysi functionni chaqirganini ko‘rsatadi.
Bir function turli callerlardan chaqirilsa, context bo‘yicha xarajat ajratiladi.
Recursive call graphni talqin qilish alohida e’tibor talab qiladi.
Flame graph
Flame graph stack sample’larni vizual ko‘rsatadi.
- gorizontal kenglik — sample ulushi;
- vertikal — call stack chuqurligi;
- blok — function.
Keng blok ko‘p vaqt yoki sample’ni bildiradi.
Rang har doim “issiq” yoki muammo ma’nosini bermaydi; generator siyosatiga bog‘liq.
Wall-clock profiling
Wall-clock vaqt CPUdan tashqari kutishni ham qamrab oladi.
Masalan:
Async serverda CPU profile past, request latency yuqori bo‘lishi mumkin.
Off-CPU profiling
Thread CPUda bo‘lmagan vaqtini tahlil qiladi.
Sabablar:
Off-CPU flame graph blocked stacklarni ko‘rsatadi.
Memory profiling
Memory profiler:
- allocation soni;
- allocation hajmi;
- live object;
- retained memory;
- heap growth;
- leak;
- call site
ni o‘lchaydi.
RSS va application heap bir xil emas.
Allocation profiling
Ko‘p kichik object allocation CPU va garbage collection xarajatini oshiradi.
Profiler qaysi function qancha allocation qilganini ko‘rsatadi.
Object pooling har doim foydali emas; o‘lchov asosida qo‘llanadi.
Heap snapshot
Managed runtime heapdagi object graphni saqlaydi.
Ko‘riladigan ma’lumot:
- object count;
- shallow size;
- retained size;
- reference chain;
- dominator tree.
Leakni topishda objectni kim ushlab turgani muhim.
Retained size
Object olib tashlansa u bilan birga qancha memory bo‘shashi retained size bilan baholanadi.
Kichik manager object katta graphni ushlab turishi mumkin.
I/O profiling
Profiler:
ni tahlil qiladi.
Kichik, ko‘p I/O calllarni batching qilish mumkin.
Lock profiling
Synchronization profiler:
ni ko‘rsatadi.
CPU optimization qilishdan oldin lock bottleneck aniqlanishi mumkin.
Hardware counter
CPU performance monitoring unit quyidagi eventlarni sanashi mumkin:
Bu microarchitecture bottleneckni tushunishga yordam beradi.
IPC
Performance kontekstida IPC — instructions per cycle.
Bu Inter-Process Communicationdan boshqa ma’no.
Past IPC:
- cache miss;
- branch miss;
- dependency;
- memory stall
sabab bo‘lishi mumkin.
Benchmark va profiler
Benchmark natijani o‘lchaydi: qancha vaqt yoki throughput.
Profiler vaqt qayerda sarflanganini ko‘rsatadi.
Yaxshi jarayon:
- benchmark;
- profile;
- bottleneckni tuzatish;
- benchmarkni qayta bajarish;
- regressionni tekshirish.
Production profiling
Production real workload beradi, ammo xavf mavjud:
Sampling, qisqa vaqt va access control ishlatiladi.
Continuous profiling
Service’lardan davriy past-overhead profile yig‘iladi.
Bu:
- performance regressiya;
- release taqqoslash;
- kam uchraydigan bottleneck;
- capacity trend
ni aniqlashga yordam beradi.
Profiling bias
Profilerning o‘zi program xatti-harakatini o‘zgartiradi.
Instrumentation katta ta’sir, sampling kichikroq ta’sir qiladi.
JIT runtime profiler mavjudligida optimizationni boshqacha bajarishi mumkin.
Natija bir nechta usul bilan tasdiqlanadi.
Debug build va release build
Debug build optimization o‘chiq bo‘lgani sabab production performance’ini ifodalamaydi.
Release build symbol bilan profil qilinadi.
Symbol strip qilingan bo‘lsa addresslar symbol server orqali yechiladi.
Profil natijasini talqin qilish
Eng ko‘p vaqt olgan function har doim xato emas. Masalan, event loopning idle wait functioni tabiiy ravishda ko‘p wall time oladi.
Muhim savollar:
- workload nima;
- self yoki total time;
- CPU yoki wait;
- request critical path;
- sample yetarlimi;
- baseline qanday.
Optimization
Profilingdan keyin:
- algorithm;
- data structure;
- I/O batching;
- cache;
- lock;
- allocation;
- query;
- serialization;
- parallelism
o‘zgartirilishi mumkin.
Micro-optimizationdan oldin yuqori darajadagi bottleneck tuzatiladi.
Diagnostika
Profiler natijasi g‘alati bo‘lsa:
- symbol;
- sampling rate;
- stack unwind;
- optimized code;
- inlining;
- JIT;
- thread filter;
- duration;
- workload;
- clock source
tekshiriladi.
Broken stack unwind flame graphda noma’lum yoki uzilgan frame’lar yaratishi mumkin.
Bog‘liq tushunchalar
CPU profiling, Sampling, Instrumentation, Flame graph, Call graph, Heap snapshot, Allocation, Hardware counter, Benchmark, Optimization