我之前使用的是 Ubuntu MATE 16.04,但最近切换到了 17.04,因为它带有更新的 thermald,我认为它会修复错误像这样对我来说。我在 Ubuntu 16.04 中遇到了与那里描述的类似的 thermald 问题,但考虑到据说该问题已在 thermald (1.5.4-3) 中修复,并且 Ubuntu 17.04 默认附带更新版本,我认为它总体上对我来说会更好,并且可能也会修复整个系统的问题。所以我安装了 17.04,尝试了一下,一切运行良好,所以我完全迁移了。
但过了一段时间,我遇到了一个非常奇怪的问题,系统完全忽略了设置的 CPU 限制。在 16.04 中,只有当英特尔 GPU 试图以高于限制的与 CPU 工作状态相关的频率工作时才会发生这种情况。例如,如果我运行:
sudo cat /sys/kernel/debug/dri/1/i915_ring_freq_table
这是我的输出:
GPU freq (MHz) Effective CPU freq (MHz) Effective Ring freq (MHz)
650 800 0
700 800 0
750 1400 0
800 1500 0
850 1600 0
900 1600 0
950 1700 0
1000 1800 0
1050 1900 0
1100 2000 0
因此,如果我希望我的 CPU 最大工作在 1500MHz,并且不会高于这个频率,那么就意味着 GPU 需要限制在 800MHz,并且永远不能高于这个频率,因为它们是绑定在一起的,因为 GPU 集成在 CPU 中。
在 Ubuntu 16.04 中,我所做的是通过写入/sys/kernel/debug/dri/1/i915_max_freq
我希望 GPU 可以达到的最大限制值来手动设置 GPU 限制。当我将 CPU 限制为 1500MHz 时,我还会运行:
echo 800 | sudo tee /sys/kernel/debug/dri/1/i915_max_freq
而且我的 GPU 将保持在范围内,不会扰乱 CPU 工作频率。
但是在 Ubuntu 17.04 中,设置限制后 GPU 仍然会一直升至 1100MHz,这使得任何 CPU 限制都毫无意义并且会导致处理器过热。
~$ sudo cat /sys/kernel/debug/dri/1/i915_max_freq
800
如您所见,限制已设置并到位。现在我们检查频率信息:
~$ sudo cat /sys/kernel/debug/dri/1/i915_frequency_info
PM IER=0x00000070 IMR=0xffffff8f ISR=0x00000000 IIR=0x00000000, MASK=0x0000002a
pm_intr_keep: 0x00000004
GT_PERF_STATUS: 0x000016cb
Render p-state ratio: 22
Render p-state VID: 203
Render p-state limit: 255
RPSTAT1: 0x00041610
RPMODECTL: 0x00000d92
RPINCLIMIT: 0x000019fa
RPDECLIMIT: 0x00003a98
RPNSWREQ: 1100MHz
CAGF: 1100MHz
RP CUR UP EI: 7165 (9171us)
RP CUR UP: 7006 (8967us)
RP PREV UP: 6725 (8608us)
Up threshold: 85%
RP CUR DOWN EI: 1314 (1681us)
RP CUR DOWN: 1315 (1683us)
RP PREV DOWN: 23741 (30388us)
Down threshold: 60%
Lowest (RPN) frequency: 650MHz
Nominal (RP1) frequency: 650MHz
Max non-overclocked (RP0) frequency: 1100MHz
Max overclocked frequency: 1100MHz
Current freq: 1100 MHz
Actual freq: 1100 MHz
Idle freq: 650 MHz
Min freq: 650 MHz
Boost freq: 1100 MHz
Max freq: 1100 MHz
efficient (RPe) frequency: 650 MHz
Current CD clock frequency: 400000 kHz
Max CD clock frequency: 400000 kHz
Max pixel clock frequency: 360000 kHz
我们可以看到,当前实际频率最高为 1100MHz。
这也会提高 CPU 频率(忽略限制),因为如果 GPU 频率升高,CPU 就无法降低频率:
~$ sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 0.97 ms.
hardware limits: 800 MHz - 2.00 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.50 GHz and 1.50 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 2.00 GHz (asserted by call to hardware).
analyzing CPU 1:
driver: intel_pstate
CPUs which run at the same hardware frequency: 1
CPUs which need to have their frequency coordinated by software: 1
maximum transition latency: 0.97 ms.
hardware limits: 800 MHz - 2.00 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.50 GHz and 1.50 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 2.00 GHz (asserted by call to hardware).
如您所见,策略范围从 1.50 GHz 到 1.50GHz,但由于 GPU,它被提升到最大值。
关闭图形应用程序后:
sudo cat /sys/kernel/debug/dri/1/i915_frequency_info
PM IER=0x00000070 IMR=0xffffff8f ISR=0x00000000 IIR=0x00000000,
[...]
CAGF: 650MHz
[...]
Lowest (RPN) frequency: 650MHz
Nominal (RP1) frequency: 650MHz
Max non-overclocked (RP0) frequency: 1100MHz
Max overclocked frequency: 1100MHz
Current freq: 650 MHz
Actual freq: 650 MHz
Idle freq: 650 MHz
Min freq: 650 MHz
Boost freq: 1100 MHz
Max freq: 1100 MHz
[...]
GPU 已恢复到最低值并且 CPU 现在在指定的限制内工作:
sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 0.97 ms.
hardware limits: 800 MHz - 2.00 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.50 GHz and 1.50 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 1.12 GHz (asserted by call to hardware).
analyzing CPU 1:
driver: intel_pstate
CPUs which run at the same hardware frequency: 1
CPUs which need to have their frequency coordinated by software: 1
maximum transition latency: 0.97 ms.
hardware limits: 800 MHz - 2.00 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.50 GHz and 1.50 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 1.49 GHz (asserted by call to hardware).
问题:如何让英特尔 GPU 遵循 Ubuntu 17.04 中设定的限制,这样它就不会再影响我的 CPU 限制,以及为什么它会忽略 16.04 中有效的限制?
更新:经过一番探索我发现了这个东西:
sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
RPS enabled? 1
GPU busy? yes [1 requests]
CPU waiting? 0
Frequency requested 650
min hard:650, soft:650; max soft:700, hard:1100
idle:650, efficient:650, boost:1100
Xorg [1221]: 591 boosts
Kernel (anonymous) boosts: 8
RPS Autotuning (current "low power" window):
Avg. up: 0% [above threshold? 95%]
Avg. down: 0% [below threshold? 85%]
这个“RPS”是什么,它是否可以成为 GPU 无视设定限制而“提升”到最大值的原因?
答案1
找到了解决方案和问题的原因 - 是 RPS boost 忽略了设置的 gpu 频率限制。
而不是通过设置限制/sys/内核/调试/dri/1/i915_max_freq,我切换到设置它/sys/class/drm/card1, 参数最大频率和gt_boost_freq_mhz. 在设置限制后i915_max_freq,它不会限制升压频率,因此当系统请求升压时,它会将其提升到指定的限制gt_boost_freq_mhz,忽略您设置的内容。
通过运行:
echo 800 | sudo tee /sys/class/drm/card1/gt_max_freq_mhz
echo 800 | sudo tee /sys/class/drm/card1/gt_boost_freq_mhz
我为正常值和增强值都设置了限制,系统不再将 GPU 推过限制,这意味着在我的情况下 CPU 限制也不会受到影响。
sudo cat /sys/kernel/debug/dri/1/i915_rps_boost_info
RPS enabled? 1
GPU busy? yes [32 requests]
CPU waiting? 0
Frequency requested 800
min hard:650, soft:650; max soft:800, hard:1100
idle:650, efficient:650, boost:800
[...]
应用此解决方案的步骤:
1)阅读表格/sys/内核/调试/dri/0/i915_ring_freq_table(或者/sys/内核/调试/dri/1/i915_ring_freq_table在某些情况下:
sudo cat /sys/kernel/debug/dri/0/i915_ring_freq_table
找到您想要的 CPU 限制内的 CPU 频率并查找与其绑定的 GPU 频率,这将是您需要在 GPU 上设置的限制。
2)通过写入来设置 GPU 频率限制最大频率和gt_boost_freq_mhz位于/sys/class/drm/card0(可卡X根据情况,必要时手动检查):
echo [GPU_frequency_limit] | sudo tee /sys/class/drm/cardX/gt_max_freq_mhz /sys/class/drm/cardX/gt_boost_freq_mhz
例如:
echo 800 | sudo tee /sys/class/drm/card0/gt_max_freq_mhz /sys/class/drm/card0/gt_boost_freq_mhz
3) 检查限制是否已达到(如果使用了 cardX,则将 0 更改为 X 值:
sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
你的最大柔软度和促进现在应该将值修改为您设置的值。
请注意,限制 GPU 频率可能会降低 OpenGL 性能。
如果您不想使用第一个解决方案,您可以尝试下面的替代方法。
还有另一种可能的替代解决方案,由于 BIOS 限制,对我来说不起作用,但对其他人来说可能有效,即限制封装功率限制,正如英特尔的 @spandruvada 在 github thermald 问题线程上建议的那样。
首先通过阅读来查看当前值/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw:
sudo cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
然后尝试通过运行以下命令更改限制值:
echo [reduced_power_value] | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
例如,在我的情况下,我有35000000作为初始值,并想将其更改为30000000:
echo 30000000 | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
如果你在尝试写入后得到“无可用数据”,那么它只是被禁用了(可以通过阅读来检查/sys/class/powercap/intel-rapl/intel-rapl:0/enabled, 将0如果它被禁用),或者被 BIOS 锁定。如果你不能通过写入来启用它1要“启用”选项,请检查 dmesg 中的错误消息(尝试写入后约束 0_功率限制:
dmesg | grep powercap
[29580.025164] powercap intel-rapl:0: package locked by BIOS, monitoring only
如果您看到“BIOS 锁定”,则需要在 BIOS 中手动启用它,如果您无法做到这一点,那么您就无法控制它,这种方法不适合您。据我了解,如果您已启用它并且它正在运行,thermald应该自动为您调整这些值,而无需您手动更改它们。
GitHub 上的问题与此建议
如果你想手动使用此方法,请参考以下详细信息这里。
答案2
我使用intel_gpu_frequency
,由 intel-gpu-tools 提供
intel_gpu_frequency -i
锁定频率至最小值
或以 800MHz 为例
intel_gpu_frequency -s 800
将频率锁定为绝对值 (MHz)
以下是该程序的 Ubuntu 手册页: https://manpages.ubuntu.com/manpages/xenial/man1/intel_gpu_frequency.1.html