feat: add samply profiler support#338
Merged
not-matthias merged 17 commits intoMay 12, 2026
Merged
Conversation
468b6c8 to
0e6e4ea
Compare
Merging this PR will not alter performance
|
b55c9b2 to
9a2ab1b
Compare
GuillaumeLagrange
requested changes
May 7, 2026
Contributor
GuillaumeLagrange
left a comment
There was a problem hiding this comment.
Switching to github mid review, have to publish 😬
GuillaumeLagrange
requested changes
May 7, 2026
Contributor
GuillaumeLagrange
left a comment
There was a problem hiding this comment.
first pass done, let me know if you want to sync on some points
021df91 to
0fdb0de
Compare
dd3a1e3 to
c7f0146
Compare
GuillaumeLagrange
approved these changes
May 12, 2026
95fba72 to
2267530
Compare
Relocate src/executor/wall_time/perf/ to src/executor/wall_time/profiler/perf/ in preparation for additional profiler backends (samply).
Output filename also changes from perf.metadata to walltime.metadata. This is a wire-breaking change that requires a coordinated server rollout to read the new filename.
PerfRunner becomes PerfProfiler implementing the Profiler trait. The RunnerFifo loop moves out of the perf module and into WallTimeExecutor, which now drives the trait callbacks (on_start_benchmark / on_stop_benchmark / on_ping / GetIntegrationMode) generically. Profiler::wrap stashes the perf control fifo and output path on the profiler instance; finalize harvests the perf.data artifacts and writes walltime.metadata. The OnceCell<BenchmarkData> bridge is gone — fifo data and timestamps are passed directly into finalize. Executor::run now takes &mut self to allow profilers to hold per-run state on the trait object. This cascades through run_executor, orchestrator, and the Memory/Valgrind executors (no behavioral change for those — they don't mutate self).
…BLED Introduce --enable-profiler / CODSPEED_PROFILER_ENABLED as the canonical flag now that walltime profiling is profiler-agnostic. The legacy --enable-perf / CODSPEED_PERF_ENABLED is kept as a hidden alias and emits a deprecation warning when used, so existing configurations keep working.
Tokio's OpenOptions::read_write is Linux-only, but the O_RDWR trick works on every Unix and is required on macOS to avoid open() deadlocks when both FIFO ends are opened before the peer process is spawned.
Mirror the clock used elsewhere in CodSpeed on macOS (mach_absolute_time with cached mach_timebase_info) so runner and benchmark process timestamps come from the exact same source. Adds mach2 as a macOS-only dependency.
Move the Linux profiling sysctl setup out of the perf profiler and into a shared walltime profiler helper. This lets both perf and samply prepare kernel symbol access and non-root profiling consistently while preserving the existing sudo-based behavior.
Use the samply crate directly instead of a standalone binary. Adds a `codspeed samply` subcommand that forwards args to samply's CLI and dispatches to `do_record_action`. The wall_time profiler re-execs the current binary, removing the need for a PATH-installed samply.
Enabling perf JIT support on macOS produces many unresolved addresses in stack traces. Force it off until we understand why.
Rename `StartBenchmark`/`StopBenchmark` to `StartProfiler`/`StopProfiler` and `BenchmarkStart`/`BenchmarkEnd` markers to `RoundStart`/`RoundEnd` to match the profiler-agnostic data format.
samply requires task_for_pid privileges that GitHub's macOS runners don't grant, causing "Could not obtain the root task". The job only exercises the walltime executor plumbing, so run it with CODSPEED_PROFILER_ENABLED=false.
…command_builder Each InternalCommands variant now owns how it's re-invoked: the current_exe() resolution, CommandBuilder construction, and argv layout all live in one place. The samply call site collapses from hand-rolled CommandBuilder setup to a single chained expression.
2267530 to
d32d356
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.