2.9 KiB
title | date | draft | tags | ||
---|---|---|---|---|---|
CPU profiling in Rust | 2020-06-24T16:37:30+02:00 | false |
|
Recently I've been hacking with Rust's recently-stabilized async/await support, and especially trying to understand how suitable it will be for building real-time audio stuff on top of. More on this topic soon I hope, but during the exploration process I discovered a nice bit of Rust tooling to share.
A key requirement of both real-time and audio software is of course performance. Habitually I keep htop or one of its Rusty cousins running in a separate tmux pane to expose general performance characteristics such as CPU usage immediately, but after identifying a general problem it's usually necessary to dive deeper and understand exactly which function calls in a particular program are the culprit(s).
Flamegraph is a crate that generates SVG diagrams, known as flamegraphs, that analyze a program's stack activity and visualizes it in a format that makes it easy to identify the stack frames (typically function calls) that a program is spending the most time in. It's neither particularly high tech stuff - flamegraphs are typically generated by triggering a periodic interrupt and building a chronological picture of the makeup of the stack - nor an exact science. But generally if your program is exhibiting poor performance then analyzing stack activity is a good place to start, and flamegraphs make the experience much prettier.
Note that flamegraphs were originally invented by Brendan Gregg who has a great writeup and a number of other resources available here. It's also worth noting that although flamegraphs are a relatively new method of visualising stack activity, the underlying approach is widely seen in other platforms - and popularly in Chrome DevTools's "timeline" tab.
Flamegraphs in Rust
This brings us to the cargo-flamegraph crate, which is a piece of Cargo tooling to allow trivial CPU profiling of Rust binaries1. It in turn depends heavily on a second crate, Inferno, to generate the actual graphs from raw dtrace data.
First step is to install using Cargo:
cargo install flamegraph
I also had to install some other dependencies:
sudo apt-get install -y linux-tools-common linux-tools-generic
as well as some kernel version-specific packages:
# Note: may not be necessary on other kernel versions
sudo apt-get linux-tools-5.3.0-59-generic linux-cloud-tools-5.3.0-59-generic
-
Or any other binary for that matter, but I'm mostly interested in profiling binaries that I build using Rust. ↩︎