#energy #measure #green #test-harness #suite #sustainable

夜间版 coppers

Coppers 是一个自定义测试框架,用于测量测试套件的能源消耗

2 个版本

0.1.1 2022年4月5日
0.1.0 2022年3月30日
0.0.1 2022年3月21日

#308 in 测试

Apache-2.0

740KB
804

Coppers

Coppers 是一个 Rust 测试框架,借助 Intel RAPL 可以测量 Rust 程序在不同版本之间的功耗演变。

要求

  • Rust 夜间版
  • Linux
  • 较新的 Intel 处理器,2013 年或之后 (为什么?)

此测试框架针对 Rust 夜间工具链,因为它依赖于 Rust 编译器的不稳定功能

  • 首先,请确保您已安装夜间工具链,可以使用 rustup install nightly
  • 然后,使用 rustup override set nightly

安装

要启用项目中的自定义测试运行器,请将其添加到您的 Cargo.toml 文件中。

[dev-dependencies]
coppers = "0.1"

将以下两行添加到您的包根目录(可能是 lib.rsmain.rs

#![feature(custom_test_frameworks)]
#![test_runner(coppers::runner)]

使用方法

在您的项目中使用 Coppers,可以使用 cargo test。这将运行您的单元测试,并报告每个测试的能源消耗。一个 JSON 格式的报告将生成在 target/coppers_results-[自纪元以来的秒数].json。此文件包含机器可读的测试输出。

在解释结果之前,请考虑结果的准确性以及如何改进它。有关更多信息,请参阅我们的关于准确性的部分

可视化

Coppers 可选支持结果的可视化输出。这些可视化可以帮助确定您的测试随时间推移的能量消耗变化。要启用可视化,请在您的 Cargo.toml 文件中启用 future 标志。

[dev-dependencies]
coppers = { version = "0.1", features = ["visualization"]}

此功能默认禁用,因为它依赖于某些 Python 包。您可以使用本存储库的 requirements.txt 文件中定义的包进行安装。

pip install -r requirements.txt

示例图表

此示例图表是通过启用visualization功能生成的。在此线图中,绿色线表示的测试随着时间的推移变得更加节能。

稳定性保证

我们使用 rust version 1.61.0-nightly (ee915c34e 2022-03-28) 开发了此项目。较新的 nightly 版本可能会改变我们依赖的一些编译器功能,例如

我们无法保证该项目与较新的 nightly 版本兼容。

限制

我们的实现有一些局限性。

Intel RAPL

目前,这仅在基于 Intel 的 Linux 机器上通过 Power Capping Framework 使用 Intel RAPL 才能工作。它可以扩展以支持非 Intel 和非 Linux 机器,但这超出了我们项目的范围。

准确性

在单个测试级别测量能量消耗可能非常精确,但准确性不高。我们当前的方法测量整个系统的能量消耗,包括和/或受以下因素的影响:

  • 操作系统
  • 您的硬件配置
  • 同时运行的其他程序
  • 电源管理设置
  • 外部设备,如 USB 驱动器、外部硬盘、显示器等。
  • 您的网络适配器的能量消耗
  • 您屏幕的亮度
  • 您硬件的温度
  • 您现实世界环境的温度
  • 您缓存中的数据(更高的缓存命中率意味着从内存检索数据所消耗的能量更少)

为了获得最准确、最可靠和可重现的结果,您可以在运行测试时采取某些预防措施。预防措施的目标是限制其他因素的影响。预防措施可以包括:

  • 当您想比较结果时,使用完全相同的硬件
  • 关闭所有非必要应用程序
  • 关闭所有通知
  • 尽可能连接所需的最小硬件数量,因此如果可能的话,避免 USB 设备、外部显示器等。
  • 终止后台运行的不必要服务
  • 如果不需要,请关闭您的网络
    • 如果您需要互联网,请首选有线连接而不是无线连接
  • 禁用自动亮度并将亮度设置为尽可能低
  • 多次重复测试

完整性

该项目尚未完成,但它是在我们遵循的短时间内所能取得的成果。可以通过以下方式扩展和改进:

  • 在测试失败时报告正确的错误代码
  • 在除了基于Intel的Linux机器之外的更多平台上运行
  • 在执行过程中调整测试顺序,以避免由于缓存命中率过高而导致测试更节能
  • 使某些功能更具可定制性,例如测试应重复的次数或是否忽略某些测试的报道

故障排除

Intel RAPL传感器未启用

您可能会收到如下错误:The location /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0 is unreachable。如果您拥有基于Intel的机器,则可以使用以下方式通过modprobe启用Intel RAPL传感器:modprobe intel_rapl_common(适用于Linux内核版本>= 5)。如果您有小于5的内核版本,则使用modprobe intel_rapl。遗憾的是,Coppers目前不支持基于非Intel的机器。

运行测试时导致权限不足

如果您运行cargo test,您可能会得到一个错误。

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "Insufficient permissions to read from /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj. You might want to retry as root."' 

这可以通过以下两种方式之一解决:

  1. 或者使用root权限再次运行测试,使用sudo -E cargo test
  2. 或者通过运行以下命令临时添加对/sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj的读取权限:
    1. sudochmod o+r /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj
    2. cargotest
    3. sudochmod o-r /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj

ModuleNotFoundError

如果您启用了visualization功能,则还需要安装所需的Python包。这可以通过安装此存储库中定义的包requirements.txt来实现,使用pip install -r requirements.txt

关于

该项目是在2022年代尔夫特理工大学可持续软件工程课程的背景下完成的。我们选择“Coppers”这个名字,因为我们的项目与绿色软件和Rust都有关,而氧化铜呈绿色。

许可

根据Apache License,版本2.0(“许可证”);除非遵守许可证,否则不得使用此文件。您可以在http://www.apache.org/licenses/LICENSE-2.0获得许可证的副本。

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何形式(明示或暗示)的保证或条件。有关许可证中规定的权限和限制的具体语言,请参阅许可证。

依赖关系

~11–19MB
~334K SLoC