使用 intel_pstate 驱动程序的电池性能非常糟糕

使用 intel_pstate 驱动程序的电池性能非常糟糕

编辑:Ubuntu (mate) 20.04,intel_pstate 驱动程序。电脑是我使用的 Razer Blade Stealth Ultrabook(2019 年初),配备 Intel Core i7 i7-8565U。

即使我将 TLP 设置为交流模式,仅使用电池供电时我也会遇到奇怪的行为(速度极度减慢)。如果我将 cpufrequtils 设置为性能模式(特别是多线程),问题会变得更糟!

我们将从单线程情况开始(即只有主线程)。我正在文件或网络摄像头的视频帧上运行一系列 OPENCV 过滤器(高斯模糊等)。如果我先将所有帧加载到内存中(即不是磁盘或设备 I/O 问题),这并不重要。下面列出了单个循环(一帧)的处理时间。这不是复杂的代码。基本上,它正在做:

Filter filters[400]
while( cap.read(frame) )
{
 for( int i=0; i<400; ++i )
 {
  filters[i].dofilter(frame);
 }
}

其中filters[i].dofilter只是调用cv::GaussianBlur、resize()等,并预先分配目标cv::Mat(我没有进行任何额外的分配)

这仅使用 CPU(即它不使用 OPENCV 透明 openCL 或任何东西)。

单线程

AC  + powersave:    71 msec (variance 70.5-71.5)
AC  + performance:  67 msec (variance 66.5-67.5)
BAT + powersave:    95 msec (variance 84.0-115.0)  *1
BAT + performance:  104 msec (variance 76.0-202.0) *2

1* Note: spikes to 110+ about every 5 sec
2* Note:  most ~96, with few spikes low to 80s and high to 120s

方法:每种条件运行 10 次,持续 60 秒(每次 10 次运行约 600 帧 = 6000),随机排序(以便热量、电池电压等不会混淆)。

我用相同的输入帧对于每个循环(换句话说,这不是由于每次处理的图像内容不同)。它实际上是在每个时间步处理完全相同的输入。如果我拔出或插入交流适配器或使用 cpufrequtils 设置省电/性能,我可以看到每帧处理时间立即发生变化。

我完全不知所措。

我使用的是 Razer Blade Stealth 超级本,配备 Intel Core i7 i7-8565U。 Ubuntu (mate) 20.04,intel_pstate 驱动程序。

所以,我有 3 个具体问题:

1)到底发生了什么?

2)如何设置TLP(内核参数?)以强制其行为就像在交流电上一样(当然电池可以提供足够的电量来运行CPU/内存绑定的单核程序,速度与在交流电上时一样快)?甚至还没有做那么多!

3)电池电源上是否有任何秘密/奇怪的设置。特别是与多线程有关?问题是高度可并行的——基本上有 8 个独立的过滤器链可以并行运行。通常我会这样做。当我在 AC 上执行此操作时,情况如下:

多线程(8 线程)

AC  + powersave:    28.6 msec (variance 26.8-31.1)
AC  + performance:  28.8 msec (variance 26.6-31.2)
BAT + powersave:    39 msec (variance 36.0-64.0)   *3
BAT + performance:  176 msec (variance 39.0-202.0) *4

3* Note: this is very tame compared to if I run with webcam -- then it spikes heavily between 40 and 90

4* Note: will update at 40 msec for a few frames, then go to 180 msec for a long time, then burst at 40 for a few.

该软件通过线程池实现多线程。我检查了锁定,即使在极端的多线程情况下也没有花时间等待锁定(这实际上是我花费最多时间的地方,因为我认为这最初是问题......)。我用 2~8 个线程得到了类似的结果。使用电池时,线程数越多(尤其是在性能模式下),速度就越慢;而使用交流电时,线程数越多,速度就越快。

编辑:即使我禁用 TLP,问题也会发生。我还没有尝试切换到旧的 acpi 频率调节器(认为这会起作用吗?)

编辑2:在单线程模式下,htop 仅显示一个固定的CPU 核心(即它不使用openmp 或其他东西来矢量化和使用更多核心)。

答案1

问题是 intel_pstate 驱动程序。

我通过启动内核参数切换到原来的ACPI驱动程序。具体来说,在 /etc/default/grub 中,我将 DEFAULT 引导行更改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=disable acpi=force"

(记住update-grub之后)。

现在,即使没有任何更改(即默认的“ondemand”):

多线程(8 线程)

BAT + ondemand:     38.5 (37.5 ~ 40.0)
BAT + performance:  31.8 (30.1 ~ 35.0) *1

1* 我每隔几秒就会看到一些非常小的峰值达到 35,但这是在合理范围内的......

讽刺的是,正常工作负载(浏览、EMACS、wifi 等)期间的功耗实际上使用 ACPI 驱动程序也比使用 intel_pstate 更好(平均 590 mA vs 660 mA)。令人高兴(但令人担忧)的副作用。

编辑:一个缺点是,在不使用 intel_pstate 驱动程序时,挂起(睡眠模式)似乎会消耗更多电量。每12小时大约10%...

答案2

这是我的内核make“仅下降”基准(即,make当没有什么可做时 - 几秒钟)。

我花了一些时间才意识到-jmake 中的选项;而且我不必重新启动即可更改 Turbo-Boost 和 SMT/超线程设置:它们可以通过/sys.

我的TDP是28W。它不是笔记本电脑,也是i5-8259U。它通常(就像现在)消耗3.5W-5W。以下是我记录的一些结果,重点是我物理测量的瓦特。

time make -j10 -O O=../make-out/

TB+HT,mitigations=off

-j8:    4.8s    57W (max.)
-j4:   12.3s    20W (-35W)  
no-j:  21.7s    19W (max.)
-j4II:  6.4s    45W

如果换成焦耳,会更精确。我认为57W包括风扇。这两个-j4结果表明:总能量(Ws=焦耳)或多或少保持恒定。

TB no, HT yes
-j10:  7.7s  22W

我记下的最后一个测试是:

TB 25-35-1sec "tau", HT yes, mitig.=off
-j10:  5.2s  40W

这个 Turbo-Boost 设置来自 BIOS - 它似乎有助于限制“最大 57W”。从第一次运行开始。

但在 sysfs 中写入 75(百分比)后,intel_pstate/max_perf_pct我现在发现了一种更好的提升方法,但只能提升到 3.0GHz,而不是 3.8GHz。

现在,我在 35W(最大 44W)的情况下只需 5.5 秒即可完成,而在 50W 左右的情况下需要 4.8 秒。无升压在 25W 时为 6.7 秒。


更多的活跃核心和更高的 CPU 频率可以使巨大的时间上的差异和瓦特。 GPU 甚至可以添加(在您的示例中?)和风扇。

我现在不知道电池是否存在电流过大的问题,除了(很快)很快耗尽之外。但我的测量结果表明,差异可能很大,并且可能会出现一些限制 - 通常是温度。

但随着一个剃须刀片超极本- 电池差!

相关内容