CONTINUOUS PROFILING DEEP DIVE
For decades, profiling was something you did in your IDE or on a staging server when things felt slow. Continuous Profiling (CP) changes the game: it runs 24/7/365 in production.
Learn Continuous Profiling: From Zero to Observability Master
Goal: Deeply understand the mechanics of continuous profilingâhow to observe code execution in production with near-zero overhead. You will learn to build agents that bypass traditional instrumentation, using eBPF and runtime hooks to walk the stack, resolve symbols from binary metadata, and generate actionable insights from the âlivingâ code of high-performance systems.
Why Continuous Profiling Matters
For decades, profiling was something you did in your IDE or on a staging server when things felt slow. Continuous Profiling (CP) changes the game: it runs 24/7/365 in production.
- The âInvisibleâ Tax: Traditional tracers can add 10-50% overhead. CP aim for <1%, making it safe for the most sensitive production environments.
- Solving the âHeisenbugâ: Many performance regressions only happen under specific production loads. Without CP, youâre guessing. With it, you have the exact stack trace of the bottleneck.
- Cost Optimization: Large-scale companies like Google and Netflix use CP to find âmicro-optimizationsâ that save millions in compute costs.
- Beyond Metrics: Metrics tell you that something is slow; CP tells you exactly which line of code is responsible.
Core Concept Analysis
1. The Profiling Lifecycle
Profiling isnât just one step; itâs a pipeline of data transformation.
[ Running Process ] -> [ Collection Agent ] -> [ Storage/Database ] -> [ Visualization ]
| | | |
Instruction Pointer Stack Walking Aggregation Flame Graphs
& Memory Allocations Symbolication Compression Iceberg Charts
2. Sampling vs. Tracing
- Tracing: Hooks every function entry/exit. High overhead, high detail.
- Sampling: Wakes up periodically (e.g., 99 times a second), checks what the CPU is doing, and goes back to sleep. Low overhead, statistically accurate.
3. Stack Walking: The Hard Part
How does the profiler know the âpathâ to the current line of code? It must âwalkâ the stack.
High Memory
+-------------------+
| main() | [Frame 0]
+-------------------+
| handle_req() | [Frame 1]
+-------------------+
| parse_json() | [Frame 2] <-- Current Instruction Pointer (RIP)
+-------------------+
Low Memory
Methods of Walking:
- Frame Pointers (FP): Uses the
RBPregister. Fast, but often optimized away by compilers (-fomit-frame-pointer). - DWARF: Uses debug information sections in the binary. Very accurate but heavy and hard to do in-kernel.
- ORC (Oops Rewind Capability): A Linux-specific compromise for kernel stack walking.
4. Symbolication: Turning Hex into Names
The kernel sees memory addresses like 0x4012ab. You need to know that this corresponds to src/parser.c:142.
Address: 0x4012ab
|
V
[ Look up in ELF Symbol Table / DWARF ]
|
V
Function: json_parse_internal
File: parser.c
Line: 142
The eBPF Advantage
eBPF allows us to run âsandboxedâ code inside the Linux kernel. This is the secret sauce for modern profilers (like Parca or Pyroscope).
User Space Kernel Space
+-----------+ +--------------------------+
| Profiler | <------- | eBPF Program |
| Collector | (Maps) | (Hooked to Perf Events) |
+-----------+ +--------------------------+
^ |
| v
+---------------------- [ CPU / Hardware ]
The eBPF program is triggered by hardware timers or kernel events, records the stack into a shared âMap,â and the user-space agent periodically reads and clears that map.
Concept Summary Table
| Concept Cluster | What You Need to Internalize |
|---|---|
| Sampling Theory | Statistical accuracy requires high enough frequency but low enough to avoid âobserver effect.â |
| Stack Unwinding | Moving from a raw Instruction Pointer to a full chain of calls (Frame Pointers vs DWARF). |
| Symbolication | Translating virtual addresses to human-readable strings using ELF metadata and debug symbols. |
| eBPF Maps | The high-performance bridge between kernel-level collection and user-level aggregation. |
| Aggregation | How to group millions of samples into a single âFlame Graphâ using hash trees or pprof formats. |
Deep Dive Reading by Concept
This section maps each concept from above to specific book chapters for deeper understanding. Read these before or alongside the projects to build strong mental models.
Foundations & Performance Theory
| Concept | Book & Chapter |
|---|---|
| Profiling Methodology | Systems Performance by Brendan Gregg â Ch. 2: âMethodologyâ |
| CPU Performance Analysis | Systems Performance by Brendan Gregg â Ch. 6: âCPUsâ |
| Memory Performance Analysis | Systems Performance by Brendan Gregg â Ch. 7: âMemoryâ |
eBPF & Kernel Tracing
| Concept | Book & Chapter |
|---|---|
| eBPF Architecture | Learning eBPF by Liz Rice â Ch. 2: âeBPF Programs and Mapsâ |
| Performance Sampling | BPF Performance Tools by Brendan Gregg â Ch. 4: âWorking with BPFâ |
| Stack Tracing with BPF | BPF Performance Tools by Brendan Gregg â Ch. 5: âCPUâ (Section: Profile) |
Binary Internals & Symbolication
| Concept | Book & Chapter |
|---|---|
| ELF File Format | How Linux Works by Brian Ward â Ch. 11: âHow the Kernel Manages Memoryâ (Binary sections) |
| Debug Symbols & DWARF | The Linux Programming Interface by Michael Kerrisk â Ch. 41: âFundamentals of Shared Librariesâ |
| Instruction Pointers | Write Great Code, Vol 1 by Randall Hyde â Ch. 11: âCPU Architectureâ |
Essential Reading Order
For maximum comprehension, read in this order:
Project List
Projects are ordered from fundamental understanding to advanced eBPF implementations.
Project 1: The âPoor Manâsâ Profiler (Sampling with ptrace)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: C
- Alternative Programming Languages: Rust, Go
- Coolness Level: Level 3: Genuinely Clever
- Business Potential: 1. The âResume Goldâ
- Difficulty: Level 2: Intermediate
- Knowledge Area: Linux Process Management / Signals
- Software or Tool:
ptrace,waitpid - Main Book: âThe Linux Programming Interfaceâ by Michael Kerrisk
What youâll build: A tool that attaches to a running process, interrupts it periodically using ptrace(PTRACE_INTERRUPT), reads the Instruction Pointer (RIP), and records which functions are being executed.
Why it teaches continuous profiling: This project forces you to grapple with the âObserver Effect.â Youâll see how stopping a process to inspect it adds latency, and why high-frequency sampling requires a more performant approach than ptrace.
Core challenges youâll face:
- Attaching to a PID â maps to understanding process permissions and namespaces
- Reading CPU Registers â maps to the
user_regs_structand hardware state - Signal handling â maps to how to resume a process without breaking it
- Rate limiting â maps to calculating overhead (e.g., if sampling takes 10ms, how many Hz can you support?)
Key Concepts:
- ptrace syscall: TLPI Ch. 11 & 12 - Michael Kerrisk
- Instruction Pointer (RIP): âComputer Systems: A Programmerâs Perspectiveâ Ch. 3 - Bryant & OâHallaron
Difficulty: Intermediate Time estimate: Weekend Prerequisites: Basic C, knowledge of Linux process IDs.
Real World Outcome
You will have a CLI tool that takes a PID and outputs a frequency list of memory addresses that were âactiveâ during the sampling period.
Example Output:
$ sudo ./pm-profiler -p 1234 -f 99
Attaching to process 1234...
Sampling at 99Hz...
[Samples Collected: 1000]
Address | Hits | Percent
-----------|------|---------
0x4012ab | 450 | 45.0%
0x4012c4 | 200 | 20.0%
0x7ff120 | 100 | 10.0%
The Core Question Youâre Answering
âHow do I look inside a running program without modifying its source code?â
Before you write any code, sit with this question. Most debugging happens with source-code access. Continuous profiling must work on âblack boxes.â
Concepts You Must Understand First
Stop and research these before coding:
- The
ptraceSyscall- How do you âseizeâ a process versus âattachâ to it?
- What happens to the process state when it is stopped?
- Book Reference: âThe Linux Programming Interfaceâ Ch. 11
- CPU Registers (x86_64)
- What is the difference between RIP, RBP, and RSP?
- How are registers mapped to the
user_regs_struct?
Questions to Guide Your Design
Before implementing, think through these:
- Timing
- How will you ensure exactly 99 samples per second? (
nanosleep?timerfd?)
- How will you ensure exactly 99 samples per second? (
- Safety
- What happens if the process dies while you are attached?
- How do you ensure you call
PTRACE_DETACHon exit?
Project 2: The eBPF Stack Collector (Kernel-Level Observation)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: C (eBPF) / Go or Rust (Loader)
- Alternative Programming Languages: C++, Python (BCC)
- Coolness Level: Level 4: Hardcore Tech Flex
- Business Potential: 4. The âOpen Coreâ Infrastructure
- Difficulty: Level 3: Advanced
- Knowledge Area: eBPF / Kernel Internals
- Software or Tool:
libbpf,bpftool - Main Book: âLearning eBPFâ by Liz Rice
What youâll build: An eBPF program that attaches to a PERF_COUNT_SW_CPU_CLOCK event. Every time the timer fires, the kernel code will use bpf_get_stackid to capture the entire call stack and store it in a BPF Hash Map.
Why it teaches continuous profiling: This is how modern production profilers work. By moving collection into the kernel, you eliminate the context-switch overhead of ptrace.
Core challenges youâll face:
- The BPF Verifier â maps to writing code the kernel can prove is safe
- BPF Maps â maps to efficiently passing data from kernel to user space
- Stack IDs â maps to how the kernel deduplicates identical stack traces
- Perf Events â maps to hooking hardware/software timers
Key Concepts:
- BPF Programs and Maps: âLearning eBPFâ Ch. 2 - Liz Rice
- Stack Tracing with BPF: âBPF Performance Toolsâ Ch. 5 - Brendan Gregg
Difficulty: Advanced Time estimate: 1-2 weeks Prerequisites: Understanding of Project 1, basic Go or Rust for the âloaderâ program.
Real World Outcome
A tool that runs in the background and aggregates âuniqueâ stack traces it sees across the whole system (or a specific PID).
Example Output:
$ sudo ./bpf-prof --pid 5678
Collecting samples... (Ctrl+C to stop)
[Stack ID 42] Hits: 550
0x7ff001
0x7ff022
0x401005
[Stack ID 89] Hits: 12
0x7ff001
0x7ff099
Thinking Exercise
The Deduplication Puzzle
Before coding, imagine you sample a process 10,000 times. 9,000 of those samples show the exact same stack: main -> loop -> work.
- If you send 10,000 stack traces to user space, how much bandwidth is wasted?
- How could you use a BPF Map to âcountâ occurrences in-kernel before the user space tool even looks at it?
Project 3: The Symbolicator (Converting Addresses to Names)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: Rust
- Alternative Programming Languages: C++, Go
- Coolness Level: Level 3: Genuinely Clever
- Business Potential: 2. The âMicro-SaaS / Pro Toolâ
- Difficulty: Level 3: Advanced
- Knowledge Area: Binary Analysis / ELF / DWARF
- Software or Tool:
gimli,objectcrate, orlibelf - Main Book: âHow Linux Worksâ by Brian Ward
What youâll build: A tool that takes a list of memory addresses and a path to a binary file, parses the ELF symbol tables (.symtab, .dynsym) and DWARF debug sections, and returns the function names and line numbers.
Why it teaches continuous profiling: Profiling data is useless as raw hex addresses. This project teaches you how programs are laid out on disk and in memory, and how âmappingâ works (/proc/PID/maps).
Core challenges youâll face:
- Parsing ELF Headers â maps to finding where the symbol table lives
- Handling ASLR â maps to calculating the âload biasâ (offset) of a running process
- DWARF State Machine â maps to decoding the complex compressed line number program
- Address Translation â maps to mapping a virtual address back to a file offset
Key Concepts:
- ELF Layout: âHow Linux Worksâ Ch. 11
- DWARF Specification: DWARF Standard (Introduction to the Debugging Format)
Difficulty: Advanced Time estimate: 1-2 weeks Prerequisites: Knowledge of Projects 1 & 2.
Real World Outcome
Youâll have a library/tool where you can input (Address, BinaryPath) and get (Function, File, Line).
Example Usage:
$ ./symbolicator --binary ./my-app --addr 0x4012ab
Result:
Function: handle_request
File: src/server.c
Line: 42
Project 4: The Flame Graph Generator (Data Visualization)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: JavaScript/TypeScript (D3.js or Canvas)
- Alternative Programming Languages: Python (Matplotlib), Go
- Coolness Level: Level 5: Pure Magic (Super Cool)
- Business Potential: 2. The âMicro-SaaS / Pro Toolâ
- Difficulty: Level 2: Intermediate
- Knowledge Area: Data Visualization / Tree Algorithms
- Software or Tool: D3.js, SVG
- Main Book: âSystems Performanceâ by Brendan Gregg
What youâll build: A web-based visualizer that takes the output from your eBPF collector (Project 2) and symbolicator (Project 3) and renders a âFlame Graph.â
Why it teaches continuous profiling: Youâll learn that profiling isnât just about collecting data; itâs about making it understandable. Youâll implement the algorithm that aggregates hierarchical stack traces into a visual representation of time spent.
Core challenges youâll face:
- Converting Stacks to Trees â maps to hierarchical data aggregation
- Layout Algorithm â maps to calculating the width of blocks based on frequency
- Interactivity â maps to zooming into specific sub-trees of the profile
- Search & Filter â maps to highlighting functions that match a regex
Key Concepts:
- Flame Graphs: âSystems Performanceâ Ch. 2.5
- Brendan Greggâs original
flamegraph.pllogic
Real World Outcome
A browser-based tool where you can upload a profile file and see a beautiful, interactive Flame Graph of your process.
Example Visualization Logic:
- Width: Represents the number of samples (Total CPU time).
- Y-Axis: Represents the stack depth.
- Color: Usually randomized within a hue to distinguish adjacent blocks.
Hints in Layers
Hint 1: The Input Format
Start by converting your data into a âfoldedâ format: main;foo;bar 42 (meaning the stack main->foo->bar was seen 42 times).
Hint 2: The Tree Structure Build a prefix tree (Trie). Each node represents a function. The âweightâ of the node is the sum of all samples that passed through it.
Hint 3: Calculating Rectangles
When rendering, the root takes 100% width. Each childâs width is (child_samples / parent_samples) * parent_width.
Project 5: The âOff-CPUâ Profiler (Where did the time go?)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: C (eBPF)
- Alternative Programming Languages: Rust (aya)
- Coolness Level: Level 4: Hardcore Tech Flex
- Business Potential: 3. The âService & Supportâ Model
- Difficulty: Level 4: Expert
- Knowledge Area: Kernel Scheduling / Context Switching
- Software or Tool:
tp_btf/sched_switch - Main Book: âBPF Performance Toolsâ by Brendan Gregg
What youâll build: A profiler that captures stacks not when the CPU is busy, but when a thread stops running (e.g., waiting for a lock, disk I/O, or network).
Why it teaches continuous profiling: Standard profilers only tell you whatâs slow while running. Off-CPU profiling tells you why your application is âhangingâ or why latency is high despite low CPU usage.
Core challenges youâll face:
- Tracking State Transitions â maps to storing the âstart waitâ time in a BPF Map
- Scheduler Hooks â maps to the
sched_switchtracepoint - Delta Calculation â maps to subtracting timestamps in-kernel
- Filtering Noise â maps to ignoring âidleâ threads
The Core Question Youâre Answering
âIf my CPU usage is only 5%, why is my request taking 2 seconds?â
This is the ultimate observability question. It moves you from âCPU profilingâ to âLatency profiling.â
Concepts You Must Understand First
- Context Switches
- What is the difference between voluntary and involuntary switches?
- How does the kernel represent a threadâs state (Running vs Sleeping)?
- eBPF Timestamping
- Using
bpf_ktime_get_ns()for high-precision timing.
- Using
Project 6: The Heap Allocator Tracer (Memory Profiling)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: C (uprobes) / Rust
- Alternative Programming Languages: Go
- Coolness Level: Level 4: Hardcore Tech Flex
- Business Potential: 2. The âMicro-SaaS / Pro Toolâ
- Difficulty: Level 3: Advanced
- Knowledge Area: Memory Management / Shared Libraries
- Software or Tool:
uprobes,malloc/freehooks - Main Book: âBPF Performance Toolsâ by Brendan Gregg
What youâll build: A tool that uses eBPF uprobes to hook into libc.soâs malloc and free functions. You will record every allocation, its size, and the stack trace that triggered it.
Why it teaches continuous profiling: This introduces âUser-space Probesâ (uprobes). Youâll understand how to profile high-level library calls without kernel-level code changes.
Core challenges youâll face:
- uprobes Performance â maps to the overhead of switching to kernel for every malloc
- Tracking âLiveâ Allocations â maps to matching
freecalls with their originalmallocin a Map - Handling Fragmentation â maps to understanding how allocators work under the hood
Project 7: The JIT Symbolicator (Profiling High-Level Languages)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: Python or Node.js (for the target) / C++ or Rust (for the profiler)
- Alternative Programming Languages: Java (using async-profiler concepts)
- Coolness Level: Level 5: Pure Magic (Super Cool)
- Business Potential: 5. The âIndustry Disruptorâ
- Difficulty: Level 4: Expert
- Knowledge Area: JIT Compilation / Runtime Internals
- Software or Tool:
/tmp/perf-PID.map, V8/JVM - Main Book: âSystems Performanceâ by Brendan Gregg
What youâll build: A tool that can symbolicate stack traces from a Just-In-Time (JIT) compiled language like Node.js or Java. Since these functions arenât in the ELF binary, you must parse the âperf mapâ files generated by the runtime.
Why it teaches continuous profiling: Most production code is JITed. Youâll learn that binary symbolication is only half the battle; the other half is cooperating with runtimes to find where they put their dynamic machine code.
Core challenges youâll face:
- Dynamic Code Generation â maps to addresses that change during execution
- Perf-Map Format â maps to reading
/tmp/perf-<pid>.mapfiles - Instruction Pointer Mapping â maps to associating a random memory address with a JS/Java method name
Real World Outcome
You will be able to profile a Node.js application from the outside (using your eBPF tool) and see function names from the Javascript code, not just node::v8::... internal C++ names.
Project 8: Container-Aware Profiler (Namespaces & Cgroups)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: Go
- Alternative Programming Languages: Rust
- Coolness Level: Level 3: Genuinely Clever
- Business Potential: 4. The âOpen Coreâ Infrastructure
- Difficulty: Level 3: Advanced
- Knowledge Area: Docker / Kubernetes / Linux Namespaces
- Software or Tool:
containerd,mountnamespaces - Main Book: âHow Linux Worksâ by Brian Ward
What youâll build: A profiler that runs on the host but correctly identifies which Kubernetes Pod or Docker Container a sampled address belongs to.
Why it teaches continuous profiling: In the cloud, âPIDsâ are messy. Youâll learn how to cross the âContainer Boundaryâ to find the right binary for symbolication by looking into the containerâs mount namespace.
Core challenges youâll face:
- Mount Namespaces â maps to finding the binary file at
/proc/PID/root/... - Container IDs â maps to mapping a kernel task to a container runtime ID
- Shared Libraries in Containers â maps to handling different versions of
libcacross containers
Project 9: The pprof Exporter (Interoperability)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: Go
- Alternative Programming Languages: Python, Rust
- Coolness Level: Level 2: Practical but Forgettable
- Business Potential: 2. The âMicro-SaaS / Pro Toolâ
- Difficulty: Level 2: Intermediate
- Knowledge Area: Protocol Buffers / Data Serialization
- Software or Tool:
pprof(Googleâs profiling tool), Protobuf - Main Book: âObservability Engineeringâ by Charity Majors
What youâll build: A converter that takes your custom binary profile format and exports it as a Gzipped Protobuf file compatible with Googleâs pprof tool.
Why it teaches continuous profiling: Youâll learn the industry standard for profile data exchange. Implementing this allows you to use established tools like go tool pprof or âGoogle Cloud Profilerâ to view your own data.
Project 10: The Multi-Process Aggregator (Fleet-wide View)
- File: CONTINUOUS_PROFILING_DEEP_DIVE.md
- Main Programming Language: Rust or Go
- Alternative Programming Languages: C++
- Coolness Level: Level 4: Hardcore Tech Flex
- Business Potential: 4. The âOpen Coreâ Infrastructure
- Difficulty: Level 4: Expert
- Knowledge Area: Distributed Systems / High-Throughput Ingestion
- Software or Tool: gRPC, ClickHouse or Prometheus-style storage
- Main Book: âDesigning Data-Intensive Applicationsâ by Martin Kleppmann
What youâll build: A central server that accepts profile streams from multiple agents (Project 2) and aggregates them by âService Nameâ and âVersion,â allowing you to see the aggregate CPU usage of a whole microservice fleet.
Why it teaches continuous profiling: This is the âContinuousâ part of Continuous Profiling. Youâll deal with high-volume data ingestion, storage strategies for profiles, and how to query millions of stacks efficiently.
Project Comparison Table
| Project | Difficulty | Time | Depth of Understanding | Fun Factor |
|---|---|---|---|---|
| 1. Poor Manâs Profiler | Level 2 | Weekend | đ˘ Basic Process Control | đ Educational |
| 2. eBPF Stack Collector | Level 3 | 1-2 Weeks | đľ Kernel/eBPF Internals | đ Hardcore |
| 3. The Symbolicator | Level 3 | 1-2 Weeks | đŁ Binary/ELF Analysis | đ§ Intellectual |
| 4. Flame Graph Gen | Level 2 | 1 Week | đĄ Data Visualization | đ¨ Creative |
| 5. Off-CPU Profiler | Level 4 | 2 Weeks | đ´ Scheduler/Latency | 𤯠Mind-bending |
| 6. Memory Tracer | Level 3 | 1 Week | đľ Heap Management | đ Insightful |
| 7. JIT Symbolicator | Level 4 | 2 Weeks | đ´ Runtime/JIT Internals | đ§ââď¸ Magical |
| 8. Container Profiler | Level 3 | 1 Week | đľ K8s/Namespaces | đď¸ Structural |
| 9. pprof Exporter | Level 2 | Weekend | đ˘ Interop/Standards | đ ď¸ Useful |
| 10. Fleet Aggregator | Level 4 | 1 Month+ | đ´ Distributed Systems | đ Enterprise |
Recommendation
Where to start?
Start with Project 1 (Poor Manâs Profiler). It provides the âAha!â moment where you realize that a program is just a series of instructions you can pause and inspect. Once you see the limitations of ptrace, move immediately to Project 2 (eBPF) to see how the industry solves it.
Final Overall Project: âThe Observability Forgeâ
The Goal: Combine all previous projects into a single, production-ready continuous profiling platform.
What youâll build:
- The Agent: A low-overhead eBPF agent (Project 2) that auto-discovers containers (Project 8).
- The Symbolicator: A sidecar service that pulls debug symbols from a central âSymbol Serverâ or S3 bucket (Project 3).
- The Ingestor: A high-performance collector (Project 10) that stores profiles in a columnar format.
- The UI: An interactive dashboard showing Flame Graphs (Project 4) with the ability to âdiffâ two time ranges to find regressions.
Why this makes you a Master: You arenât just building a tool; youâre building an infrastructure. Youâll have to solve the âProfile-Symbol-Mismatchâ problem, handle agent crashes, and ensure that your own profiler doesnât become the bottleneck.
Summary
This learning path covers Continuous Profiling through 10 hands-on projects. Hereâs the complete list:
| # | Project Name | Main Language | Difficulty | Time Estimate |
|---|---|---|---|---|
| 1 | Poor Manâs Profiler | C | Level 2 | Weekend |
| 2 | eBPF Stack Collector | C (eBPF) / Go | Level 3 | 1-2 Weeks |
| 3 | The Symbolicator | Rust | Level 3 | 1-2 Weeks |
| 4 | Flame Graph Generator | TypeScript | Level 2 | 1 Week |
| 5 | Off-CPU Profiler | C (eBPF) | Level 4 | 2 Weeks |
| 6 | Memory Allocation Tracer | C (eBPF) | Level 3 | 1 Week |
| 7 | JIT Symbolicator | Rust / C++ | Level 4 | 2 Weeks |
| 8 | Container-Aware Profiler | Go | Level 3 | 1 Week |
| 9 | pprof Exporter | Go | Level 2 | Weekend |
| 10 | Fleet Aggregator | Rust | Level 4 | 1 Month+ |
Recommended Learning Path
For beginners: Start with projects #1, #4, and #9. Focus on the data format and basic collection. For intermediate: Jump to #2, #3, and #6. Master eBPF and binary analysis. For advanced: Focus on #5, #7, #8, and #10. Build for scale and complex runtimes.
Expected Outcomes
After completing these projects, you will:
- Understand exactly how eBPF programs interact with kernel events.
- Be able to parse ELF/DWARF/JIT metadata from scratch.
- Know how to walk the stack without frame pointers.
- Implement high-performance data visualization for hierarchical data.
- Design distributed systems capable of handling millions of performance samples per second.
Youâll have built 10 working projects that demonstrate deep understanding of Continuous Profiling from first principles.