Bosh sahifa Wiki Profiler

Profiler

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:

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:

  • cycles;
  • instructions;
  • cache miss;
  • branch miss;
  • TLB miss;
  • stalled cycle;
  • memory access.

Bu microarchitecture bottleneckni tushunishga yordam beradi.

IPC

Performance kontekstida IPC — instructions per cycle.

Bu Inter-Process Communicationdan boshqa ma’no.

Past IPC:

sabab bo‘lishi mumkin.

Benchmark va profiler

Benchmark natijani o‘lchaydi: qancha vaqt yoki throughput.

Profiler vaqt qayerda sarflanganini ko‘rsatadi.

Yaxshi jarayon:

  1. benchmark;
  2. profile;
  3. bottleneckni tuzatish;
  4. benchmarkni qayta bajarish;
  5. 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:

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:

o‘zgartirilishi mumkin.

Micro-optimizationdan oldin yuqori darajadagi bottleneck tuzatiladi.

Diagnostika

Profiler natijasi g‘alati bo‘lsa:

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