Compare commits

...

1 Commits

Author SHA1 Message Date
Rob Watson be98210ee6 WIP: CPU profiling on Rust 2020-06-24 23:11:27 +02:00
1 changed files with 40 additions and 0 deletions

View File

@ -0,0 +1,40 @@
---
title: "CPU profiling in Rust"
date: 2020-06-24T16:37:30+02:00
draft: false
tags: ["coding", "rust"]
---
Recently I've been hacking with Rust's [recently-stabilized async/await support](https://blog.rust-lang.org/2019/11/07/Async-await-stable.html), 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](https://hisham.hm/htop/) or one of its [Rusty cousins](https://www.wezm.net/v2/posts/2020/rust-top-alternatives/) 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](https://github.com/flamegraph-rs/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](http://www.brendangregg.com/flamegraphs.html). 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](https://developers.google.com/web/tools/chrome-devtools/rendering-tools)'s "timeline" tab.
## Flamegraphs in Rust
This brings us to the [cargo-flamegraph crate](https://crates.io/crates/flamegraph), which is a piece of Cargo tooling to allow trivial CPU profiling of Rust binaries[^1]. It in turn depends heavily on a second crate, [Inferno](https://github.com/jonhoo/inferno), to generate the actual graphs from raw dtrace data.
First step is to install using Cargo:
```bash
cargo install flamegraph
```
I also had to install some other dependencies:
```bash
sudo apt-get install -y linux-tools-common linux-tools-generic
```
as well as some kernel version-specific packages:
```bash
# 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
```
[^1]: Or any other binary for that matter, but I'm mostly interested in profiling binaries that I build using Rust.