观察 Linux 上程序的能源使用情况的最佳方法是什么?

Vit*_*lis 7 battery command-line power-management

我正在做研究,想要一些有关我编写的两种算法的能耗的信息,但我没有钱购买专用设备。我计划运行这两个程序 5 分钟,并想测量它们的能耗比率(例如,程序 A 消耗的功率(瓦​​)是程序 B 的 1.2 倍)

我做了一些研究并找到了诸如

upower -d
Run Code Online (Sandbox Code Playgroud)

但即使在阅读手册后我也不确定如何正确解释它,并且想知道是否还有其他比这更好的解决方案。

我在裸机笔记本电脑上使用以下发行版:

uname -a
Linux linuxbox 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

Dou*_*ies 2

Linux 中有效利用能源的重要性日益增加。越来越多的基准类型测试将能源使用作为附加评估标准。

这个答案使用turbostat程序,它适用于大多数现代英特尔处理器、一些AMD处理器以及可能还有其他一些处理器。它在多个包中可用,虽然上游保证不依赖内核版本,但 Ubuntu 将其包装在一个非常非常严格的依赖包装器中。

我将使用 1 分钟而不是 5 分钟,但这里的建议是进行多次测试。

首先,测量可能更长时间的闲置能量。观察空闲能量消耗的稳定性,即噪音有多大。请注意,我实际上捕获并绘制了多个小时的空闲数据。有时,测试期间会发生一些 cron 作业或其他意外情况,因此最好多次运行测试,以便异常值更加明显。重新启动后至少等待 5 分钟(最好是 15 分钟),然后再进行任何测试,以使系统稳定下来。

哦,顺便检查一下你的计数器环绕限制:

doug@s18:~$ sudo ./turbostat --num_iterations 1
...
RAPL: 2759 sec. Joule Counter Range, at 95 Watts
...
Run Code Online (Sandbox Code Playgroud)

未来的读者请注意:不需要上述检查,因为待处理的补丁将由 Turbostat 负责处理环绕。

闲置的:

doug@s18:~$ sudo ./turbostat --Summary --quiet --Joules --show Pkg_J --interval 60
Pkg_J
78.97
77.71
74.75
74.37
74.44
74.42
74.72
74.50
74.97
74.79
74.53
74.52
74.39
74.32
74.30
74.35
74.41
74.41
74.63
74.71
Run Code Online (Sandbox Code Playgroud)

去掉前 2 个样本,平均值为 74.53 焦耳。

现在,在测试程序运行时获取能量数据。做到这一点的最好方法是测试特定的程序,并且它本身就是一个主题。假设能耗与时间恒定(否则我们应该采样并绘图),并且程序可以在某个循环中保持运行,以便轻松获取多个样本:

doug@s18:~$ sudo ./turbostat --Summary --quiet --Joules --show Pkg_J ~/c/consume 40 73 60 1
Ave. work percent: 44.343601
60.002474 sec
Pkg_J
174.13
Run Code Online (Sandbox Code Playgroud)

那是:intel_cpufreqCPU 频率缩放驱动程序和ondemandCPU 频率缩放调节器。现在请performance州长来介绍一下变化:

doug@s18:~$ sudo ./turbostat --Summary --quiet --Joules --show Pkg_J ~/c/consume 40 73 60 1
Ave. work percent: 29.533655
60.002356 sec
Pkg_J
240.78
Run Code Online (Sandbox Code Playgroud)

它不相关,但我使用的程序的参数意味着 40% 的工作/睡眠名义比率,但每个时间间隔要做的固定工作(因此 29% 仅用于性能)、73 赫兹工作/睡眠频率、60 秒。

方法2、多样本。如果程序可以循环运行(也许是从脚本中运行),则需要更多样本,以便可以识别和忽略异常值:

一经请求:

doug@s18:~$ sudo ./turbostat --Summary --quiet --Joules --show Pkg_J --interval 60
Pkg_J
188.11
178.26
178.68
179.42
180.86
183.31
183.31
186.55
Run Code Online (Sandbox Code Playgroud)

平均:182.31 焦耳

表现:

doug@s18:~$ sudo ./turbostat --Summary --quiet --Joules --show Pkg_J --interval 60
Pkg_J
241.97
245.07
244.82
253.09
263.40
261.08
255.77
251.53
Run Code Online (Sandbox Code Playgroud)

平均:252.09 焦耳

因此,对于这个 1 分钟的示例:
按需 = 182.31 - 74.53 = 107.78 焦耳(1.80 瓦)
性能 = 252.09 - 74.53 = 177.56 焦耳(2.96 瓦)

注意:这个答案是用能量(焦耳)写成的,但它也可以很容易地用功率(瓦特)写成。例子:

doug@s18:~$ sudo ./turbostat --Summary --quiet --show PkgWatt --interval 60
PkgWatt
3.07
3.08
3.12
3.24
Run Code Online (Sandbox Code Playgroud)

现在这是处理器封装能量/功率,但是电源消耗呢?对于这台计算机,运行上述功能(按需)时的功耗为 38.84 瓦,不运行时为 36.83 瓦,与上面的 1.80 瓦相比,相差 2 瓦。


小智 1

你见过吗powertophtoppowertop 是一个类似于、 或的进程监视器top,但它为您提供每个进程的估计功耗(以瓦为单位)。您可以使用 csv 模式来--csv=output.csv收集 csv 格式的数据。在这里查看:

Powertop 信息和下载网站