hotpath 0.16.0

One profiler for CPU, time, memory, and async code - quickly find and debug performance bottlenecks.
Documentation
# Debugging `hotpath-cpu` on Linux

Persistent Ubuntu container with `samply` + Rust toolchain for iterating on
`hotpath-cpu` from macOS (or any non-Linux host).

## Build image

```bash
docker build -f crates/hotpath/linux-dev/Dockerfile -t hotpath-linux .
```

## Host kernel setup (per VM boot)

`samply` needs `kernel.perf_event_paranoid <= 1`. Lives on **host kernel**;
`/proc/sys` is read-only inside containers, so cannot be set from the
Dockerfile or `docker exec`.

Bare-metal Linux:

```bash
echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid
```

Docker Desktop (host kernel = LinuxKit VM):

```bash
docker run --rm --privileged --pid=host justincormack/nsenter1 \
  /sbin/sysctl -w kernel.perf_event_paranoid=1
```

Resets on VM restart.

## Start persistent container

```bash
docker run -d --name hotpath-linux \
  --cap-add=SYS_PTRACE --cap-add=PERFMON \
  --security-opt seccomp=unconfined \
  -v "$PWD":/work -w /work \
  -e CARGO_TARGET_DIR=/work/target-linux \
  hotpath-linux sleep infinity
```

`CARGO_TARGET_DIR=/work/target-linux` keeps container builds separate from
host `target/` (different arch).

Log in:

```bash
docker exec -it hotpath-linux bash
```

## Run CPU smoke test

`cargo run` of an example does **not** build sibling bins, so build the
`hotpath-samply` wrapper first and point `HOTPATH_SAMPLY_WRAPPER_BIN` at it:

```bash
docker exec -it hotpath-linux bash -lc '
  cargo build -p hotpath --bin hotpath-samply --features hotpath-cpu --profile profiling &&
  HOTPATH_SAMPLY_WRAPPER_BIN=/work/target-linux/profiling/hotpath-samply \
    cargo run -p test-tokio-async --example cpu_basic \
      --features "hotpath,hotpath-cpu" --profile profiling
'
```

A working run prints both the `timing` table and a `functions-cpu` table
attributing samples to `heavy_work` / `light_work`.

## Suppressing `[1]+ Stopped` shell noise

`samply` periodically `SIGSTOP`s the target to read `/proc/<pid>/maps`
coherently. The shell sees the stop and prints `[1]+ Stopped ...`, delaying
output. SIGSTOP is uncatchable.

Workaround: run under `setsid -w` (new session, detached from controlling
TTY):

```bash
setsid -w cargo run -p test-tokio-async --example cpu_basic \
  --features='hotpath,hotpath-cpu' --profile profiling
```