Introducing Flame Charts for All CPU Profiles

The temporal dimension flame graphs might be missing.

Flame charts are now generally available for all CPU profiles in Polar Signals Cloud. Originally introduced as an alpha feature for GPU profiling, flame charts bring a temporal dimension that traditional flame graphs simply cannot offer - showing not just where time is spent, but when. After validating the feature with GPU profiling users, we realized the temporal view is universally valuable and extended it to every CPU profile collected by Parca Agent.

Flame Graphs vs. Flame Charts: The Missing Dimension

Flame graphs are the workhorse of performance analysis. They answer one question extremely well: which functions consume the most resources? To do this, they intentionally discard time - stacks are sorted alphabetically, and identical call chains are merged together. The result is a compact, aggregated view of where your program spends its cycles.

Flame charts flip this trade-off. Instead of merging stacks, they preserve the original time ordering. The x-axis represents wall-clock time, so you can see exactly when each function was executing and for how long. This makes patterns like periodic spikes, phase changes, and scheduling behavior immediately visible - none of which survive the aggregation step in a flame graph.

If you want a deeper comparison, read Flame Charts: The Time-Aware Sibling of Flame Graphs. And if you're new to flame-style visualizations entirely, start with Ice and Fire: How to read icicle and flame graphs.

The above image shows a single profile for a single node and a single CPU running Prometheus. On the left is the flame graph, which aggregates time spent, and on the right is a flame chart where specific stacks have been visualized. It's possible to see that Prometheus first ran rule evaluation and then garbage collection happened after that.

From GPUs to CPUs: How We Got Here

We originally built flame charts for GPU profiling. GPU workloads are inherently temporal - kernel launches happen in sequences, and understanding the order and duration of those launches is critical for optimization. A flame graph that merges all kernel invocations together loses exactly the information GPU developers need most.

Once we shipped the alpha, something became clear: CPU workloads benefit from the same temporal view. Garbage collection pauses that spike every 30 seconds, cron jobs that fire on schedule, lock contention that appears only under specific request patterns - all of these show up as distinct visual signatures in a flame chart while being averaged away in a flame graph.

We validated the feature with GPU profiling users, extended it to CPU profiles from Parca Agent, and hardened the implementation. Flame charts are now GA for all CPU & GPU profiles in Polar Signals Cloud.

This flame chart shows how first GC is running then a rule evaluation and then finally GC again. Flame graphs would simply not surface this.

What's New

Grouping by Labels

Parca Agent collects profiles across all nodes and CPU cores. Without filtering, these stacks overlap in a single flame chart and become impossible to read. There are two ways to deal with this: filter your query down to a single node and CPU core, or group by labels.

Grouping by node and CPU gives each combination its own horizontal strip. You can scan the strips to see where each node and core was busy, then click on the strip you want to inspect in detail. This is also useful for comparison - if one node behaves differently from the rest, the strips make that obvious at a glance.

The grouping uses labels already attached to your profiles, so there's nothing extra to configure.

This image shows the samples per CPU core for a previously filtered node. The first samples of CPU with ID 9 have been selected to get a flame chart.

Zooming

Individual stacks in a flame chart are often only milliseconds wide - even when looking at just one second of data, most stacks are too narrow to read without zooming in. Use the zoom buttons in the UI, or scroll with Ctrl+mousewheel on Windows/Linux and Cmd+mousewheel on macOS to magnify any region.

This also means you can query longer time ranges to get the full picture, then zoom into the moment you care about without losing context.

Zooming into small stacks reveals what was actually going on down to the nanosecond.

When to Use Flame Charts

Flame charts complement flame graphs - they don't replace them. Here's when to reach for one:

  • Periodic behavior: Is a function running constantly at low overhead, or spiking every 30 seconds? A flame graph shows the same total CPU time either way. Only the flame chart reveals the pattern.
  • Understanding parallelism: Group by CPU core to see how work is distributed over time. Are all cores busy, or is one core handling everything while the rest sit idle?
  • Investigating latency: When p99 latency spikes but average throughput looks fine, flame charts can reveal the intermittent behavior that flame graphs average away.

Think of it this way: flame graphs answer "where is time spent overall?" and flame charts answer "what happened and when?"

Try It Today

Flame charts are available now for all Polar Signals Cloud users. Any CPU profiles collected by Parca Agent work automatically - no configuration changes needed. Just open a profile and switch to the flame chart view.

You can try this feature on Polar Signals Cloud today with the 14-day free trial if you haven't already, and let us know your feedback on our Discord community.

For those processing large profiles, you may also be interested in how we handle rendering at scale with Parallel Flame Graph Rendering.

Keep up with Polar Signals

Receive new posts, product updates, and insights on performance engineering straight to your inbox.