1 个不稳定版本
0.1.0 | 2024年6月17日 |
---|
#97 在 性能分析
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
中查看。
它做什么
noaslr
:通过/proc/sys/kernel/randomize_va_space
禁用 地址空间布局随机化 (ASLR)。cpuset
:通过cgroup cpuset将目标进程的cgroup固定在特定的CPU(s)上,用于独占使用。noht
:如果启用超线程,通过CPU热插拔禁用(设置为离线)所使用的CPU的线程兄弟。cpufreq
:将目标CPU(s)的电源管理器设置为'性能'并禁用自适应超频/加速,通过CPU性能缩放。noirq
:从IRQ亲和度屏蔽所使用的CPU(s)。
这些控制模块可以通过--with=
或--without=
单独启用或禁用。
它不具备的功能
-
我们不进行基准测试,但我们为基准测试程序设置环境和可调整参数,使其基准测试更加可靠。它预计将与基准测试框架/程序如
criterion
或hyperfine
一起使用。 -
环境控制不会使程序运行得更快,通常相反,因为我们默认禁用了频率提升。我们的目标是一致性而不是性能。
-
我们减少了外部噪声,以避免污染基准测试结果。但我们无法神奇地稳定内部偏差。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)的情况下也会进行清理。如果不这样做,请报告一个错误。
致谢
- 受LLVM基准测试提示的极大启发。
- 感谢QuarticCat@github提供超频/加速控制提示。
- 感谢PeterCxy@github提供IRQ控制提示。
依赖关系
~5–32MB
~475K SLoC