Flame graph — profillash namunalaridagi call stacklarni birlashtirib, dastur qayerda CPU vaqti yoki boshqa resurs sarflayotganini vizual ko‘rsatadigan diagrammadir. Har to‘rtburchak funksiya yoki stack frame’ni bildiradi; uning eni shu frame mavjud bo‘lgan namunalar ulushiga proporsional. Vertikal o‘q vaqt ketma-ketligi emas, chaqiruv chuqurligidir.
Qurilish jarayoni
Sampling profiler ma’lum intervalda threadning call stackini oladi. Bir xil stacklar sanaladi, keyin frame yo‘llari tartiblanib birlashtiriladi. Pastki qator root yoki thread entry, uning ustidagi bloklar chaqirilgan funksiyalar bo‘ladi. Bir funksiya turli parentlardan chaqirilsa, graphda bir nechta joyda ko‘rinishi mumkin.
Blokning eni inclusive vaqtga yaqin: funksiya o‘zi yoki uning descendants ichida nechta namuna olinganini bildiradi. Funksiyaning faqat o‘z xarajatini bilish uchun uning ustidagi chaqiruvlarni va self sample’larni tahlil qilish kerak. Rang odatda estetik yoki kategoriya uchun ishlatiladi; klassik flame graphda qizil rang “muammo” degani emas.
Talqin
Keng “plato” katta resurs ulushini egallagan call pathni ko‘rsatadi. Optimizatsiya uchun eng keng blokni avtomatik ayblash to‘g‘ri emas: event loop yoki scheduler normal ravishda keng bo‘lishi mumkin. Biznes uchun zarur hisob ham umumiy vaqtning katta qismini oladi. Avval workload reprezentativligi va latency maqsadi aniqlanadi.
Off-CPU flame graph thread CPU’da ishlamagan paytdagi stacklarni, masalan lock, disk yoki tarmoq kutishini ko‘rsatadi. Allocation flame graph xotira ajratish hajmi yoki sonini, differential flame graph esa ikki profil o‘rtasidagi o‘sish va kamayishni ifodalaydi. O‘lchov turi sarlavhada aniq ko‘rsatilmasa, diagramma noto‘g‘ri talqin qilinadi.
Stack sifati
Frame pointer olib tashlangan yoki unwind ma’lumoti yetishmagan bo‘lsa stacklar uzilishi mumkin. JIT runtime yaratgan kod uchun profiler symbol va runtime mappingga muhtoj. Inlining fizik callni yo‘qotsa ham debug metadata mantiqiy inline frame’ni tiklashi mumkin. Noma’lum manzillar ko‘p bo‘lsa, xulosa qilishdan oldin symbolization tuzatiladi.
Sampling chastotasi juda past bo‘lsa qisqa funksiyalar ko‘rinmaydi, juda yuqori bo‘lsa profiling overhead oshadi. Periodik ish sampling intervali bilan sinxronlashib bias yaratishi mumkin; randomization yordam beradi. Profil vaqt oralig‘i deploy, trafik va CPU model bilan birga qayd etiladi.
Amaliy foydalanish
Flame graph qaysi stacklar tekshiruvga arzigani haqida yo‘nalish beradi. O‘zgarishdan oldin va keyin bir xil workload bilan profil olinadi, throughput va latency alohida o‘lchanadi. Funksiyani optimallashtirish uning enini kamaytirsa ham, bottleneck boshqa joyga ko‘chishi mumkin. Diagrammada funksiya nomi, source va paket ichki ma’lumotni ochishi mumkin, shuning uchun production profili himoyalangan artefakt sifatida saqlanadi.
+## Vaqt bo‘yicha o‘zgarish
Oddiy flame graph butun intervalni yig‘ib yuboradi va qisqa spike qachon bo‘lganini ko‘rsatmaydi. Time-ordered yoki icicle variantlari hodisani vaqt bo‘yicha ajratishi mumkin. Profilni request turi, tenant yoki CPU bo‘yicha segmentlash o‘rtacha ko‘rinishda yashiringan sekin yo‘lni topadi. Faqat xato bo‘lgan request stacklarini tanlash uchun trace ID bilan profiler sample’ini bog‘lash foydali. Differential graphda rang o‘zgarish yo‘nalishini, eni esa ma’lum taqqoslash bazasini ifodalaydi; sample soni juda kichik bo‘lsa farq shovqin bo‘ladi. Bir xil davomiylik, trafik va symbol sozlamasi adolatli taqqoslash uchun saqlanadi.
Bog‘liq tushunchalar
Sampling profiler, Call stack, CPU profiling, Off-CPU analysis, Symbolization, Performance, Call graph