Continuous Profiling
Always-on flame graphs from production — Pyroscope, Parca, Polar Signals.
The third pillar after metrics and tracing. By 2026 it's affordable and ubiquitous.
What it is
Sample CPU / memory / IO / off-CPU from production processes continuously. Get flame graphs filtered by service / version / time / container — without restarting anything.
Open-source backends
- ★ Pyroscope (Grafana Labs) — Phlare-merged; multi-format (pprof, JFR, .NET); pairs with Grafana. The default.
- Parca (Polar Signals) — eBPF-based whole-system profiling; minimal app instrumentation.
- Apache SkyWalking eBPF — bundled with SkyWalking.
Hosted
- ★ Grafana Cloud Profiles — managed Pyroscope; generous free tier.
- Polar Signals Cloud — managed Parca.
- Datadog Continuous Profiler — paid; great UI.
- New Relic CodeStream — Code-level perf; paid.
- Sentry Continuous Profiling — bundled with Sentry; paid tier.
Agents / instrumentation
- ★ Pyroscope agent — Go / Java / Python / Ruby / .NET / Node.js (eBPF + manual SDKs).
- ★ Parca agent — eBPF; sees every process on a host with no app changes.
- OpenTelemetry profiling signal — newer standard; SDKs adding it; Pyroscope and Parca both can ingest.
- pprof endpoints in Go / Rust services — Pyroscope scrapes these directly.
- Async-profiler (Java) — bundled or scraped by Pyroscope.
Profiling types
- CPU — where time is spent.
- Allocations — where memory is being allocated.
- Inuse memory — where memory currently lives.
- Goroutines / threads — concurrency view.
- Off-CPU / blocked — where threads are waiting.
- Lock contention — synchronization.
Patterns to adopt
- ★ Default to eBPF where possible. Parca / Pyroscope eBPF agents avoid the "instrument every service" problem.
- Tag profiles with service / version / region. Filter in the UI.
- Compare versions — the killer feature. "Did my change make this slower?"
- Sample, don't always-record at full rate. 100Hz is usually plenty.
- Look at off-CPU when latency is the question — CPU profiles miss waiting time.
When profiling matters
- A service is slow and metrics / traces don't explain why.
- Memory growth that smells like a leak.
- A specific request type is slow consistently — flame graph the spans involved.
- Cost optimization: figure out what's burning CPU you're paying for.
- Pre-launch perf testing.
When it's overkill
- Tiny services, low traffic, occasional perf issue.
node --proforpprofad-hoc is enough. - You don't have basic metrics yet — add those first.
Pick this if…
- Default OSS: Pyroscope.
- Whole-system / eBPF: Parca.
- Hosted, free tier: Grafana Cloud Profiles.
- Already on Datadog: their continuous profiler.
- Java-heavy: async-profiler integration via Pyroscope.
- Go service: Pyroscope scraping
/debug/pprof.