1 个不稳定版本

0.1.0 2024年6月17日

#97性能分析

GPL-3.0 或更高版本

47KB
1K SLoC

[cargo-]cbench

Linux/systemd 上的基准测试环境控制,减少基准测试结果的外部噪声。

cbench 可以用来运行任何程序。 cargo-cbench 是一个包装器,提供类似于 cargo bench 的界面,方便运行 cargo benches

安装

cargoinstall cbench

使用方法

对于具有 cargo benches 的 Rust 项目,只需将 cargo bench 替换为 cargo cbench

cargocbench

这将设置环境并调整系统可配置项(见下一节),运行当前项目的所有 cargo 基准测试,并最终恢复到原始状态。

它将为基准测试分配单个 专用 CPU。如果您的程序是多线程的,您可以通过

cargocbench --cpus=1-2

可以使用相同的语法传递 Cargo 标志和基准程序标志

cargocbench --bench=bench1 --features=feat1 ----exact foo

对于其他基准测试框架,运行 cbench 后跟命令

cbench hyperfine/some/benchee

默认情况下,目标命令将在名为 'cbench.service' 的 systemd 单元中作为当前用户运行。它将在一个干净的环境中运行,而不继承当前 shell。如果您的命令依赖于某些环境变量,您需要通过 --setenv=ENV--setenv=ENV=VALUE 明确传递它们。

更多控制参数可以在 cbench --help 中查看。

它做什么

这些控制模块可以通过--with=--without=单独启用或禁用。

它不具备的功能

  • 我们不进行基准测试,但我们为基准测试程序设置环境和可调整参数,使其基准测试更加可靠。它预计将与基准测试框架/程序如criterionhyperfine一起使用。

  • 环境控制不会使程序运行得更快,通常相反,因为我们默认禁用了频率提升。我们的目标是一致性而不是性能。

  • 我们减少了外部噪声,以避免污染基准测试结果。但我们无法神奇地稳定内部偏差。Benchee可能仍然在不同内存(堆和栈)布局下不稳定,这可能是由于环境变量或程序初始化时的“幸运”所导致的,通过多次运行产生看似随机的系统性偏差。您需要仔细编写您的benchee程序以减少这种影响。

    有关更多信息,请参阅stabilizer

特权操作

上面提到的所有设置都是特权的且是机器全局的。为了最大限度地减少影响和安全风险,我们利用systemd-run的特权ExecStartPre=/ExecStopPost=命令,因此只有环境设置和重置将以root权限执行。默认情况下,通过PolKit由systemd-run本身进行身份验证,或者您可以使用--use-sudo使用sudo

请注意,无论是否使用--use-sudo,程序编译(通过cargo build)和基准测试过程始终以当前用户身份运行。永远不要在cargo cbench本身中添加sudo!即使您真的想以root身份运行目标工件/命令,例如您正在运行perf stat --all-kernel,请使用选项--root

程序退出后,将通过systemd的ExecStopPost=命令还原环境修改,即使在目标进程意外终止(例如通过Ctrl-C)的情况下也会进行清理。如果不这样做,请报告一个错误。

致谢

依赖关系

~5–32MB
~475K SLoC