设置Intel H系列CPU的最大TDP

sam*_*sam 3 power-management cpu intel-cpu 18.04

我正在寻找一些可以设置CPU最大 TDP的程序,就像我们在 Windows 上的 Intel XTU 中所做的那样。我能够通过这个项目对 CPU 进行降压。我还可以使用这个优秀的项目来监控 CPU 的 TDP 。我在互联网上搜索过任何此类程序,但没有找到。

编辑1:

我的系统有一个 Core i7-9750H CPU,OEM 将最大 TDP 设置为 60 瓦,在 Ubuntu 18.04LTS 上运行,内核为 4.18.20-041820-generic。

编辑2

我已将内核更新为 5.3.0-46-generic(带符号),输出sudo turbostat --Summary --interval 5 --show Avg_MHz,Busy%,Bzy_MHz,IRQ,PkgTmp,PkgWatt,GFXWatt如下:

...
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0.125000 Watts, 0.000061 Joules, 0.000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x00000168 (45 W TDP, RAPL 0 - 0 W, 0.000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x42835800dd8230 (UNlocked)
cpu0: PKG Limit #1: ENabled (70.000000 Watts, 28.000000 sec, clamp ENabled)
cpu0: PKG Limit #2: ENabled (107.000000 Watts, 0.002441* sec, clamp DISabled)
...
Run Code Online (Sandbox Code Playgroud)

输出rdmsr --bitfield 14:0 -d 0x610为560。这意味着最大输出为0.125 * 560 = 70瓦

的输出sudo rdmsr 0x610是42835800dd8230。

您能否详细说明一下计算@doug-smythies

Dou*_*ies 6

对于您的处理器Core i7 9750H,默认 TDP 为 45 瓦。如果您的处理器支持,您可以调整 TDP。

方法一

本例使用 i5-9600K。首先,我使用 Turbostat(linux-tools-common 软件包)查看现在的 TDP 以及比例因子是多少:

doug@s18:~$ sudo turbostat --Summary --interval 5 --show Avg_MHz,Busy%,Bzy_MHz,IRQ,PkgTmp,PkgWatt,GFXWatt
...
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0.125000 Watts, 0.000061 Joules, 0.000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x000002f8 (95 W TDP, RAPL 0 - 0 W, 0.000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x4283e800dd8320 (UNlocked)
cpu0: PKG Limit #1: ENabled (100.000000 Watts, 28.000000 sec, clamp ENabled)
cpu0: PKG Limit #2: ENabled (125.000000 Watts, 0.002441* sec, clamp DISabled)
...
Run Code Online (Sandbox Code Playgroud)

所以,我们知道比例因子是 0.125 瓦,并且有人似乎已经将功率限制从默认的 95 调整到 100 瓦,但让我们通过直接读取 MSR 来检查:

root@s18:/home/doug# rdmsr --bitfield 14:0 0x610
320

root@s18:/home/doug# rdmsr --bitfield 14:0 -d 0x610
800
Run Code Online (Sandbox Code Playgroud)

请注意,我读取了寄存器两次,一次以十六进制(基数 16)读取,一次以十进制(基数 10)读取。

800 * 0.125 = 100 瓦。

现在,假设我想将其设为 50 瓦,首先再次读取寄存器,但保留所有内容:

root@s18:/home/doug# rdmsr 0x610
4283e800dd8320
Run Code Online (Sandbox Code Playgroud)

现在更改相应的位字段(从上面的 14 更改为 0)。对于最低有效 16 位,我们有:

8    3    2    0
1000 0011 0010 0000
Run Code Online (Sandbox Code Playgroud)

取出 0x320(800 以 10 为底)并放入 50 / 0.125 = 400 = 0x190:

8    1    9    0
1000 0001 1001 0000

root@s18:/home/doug# wrmsr 0x610 0x4283e800DD8190
root@s18:/home/doug# rdmsr 0x610
4283e800dd8190
Run Code Online (Sandbox Code Playgroud)

并用涡轮稳定器检查它:

doug@s18:~$ sudo ~/turbostat --Summary --interval 5 --show Avg_MHz,Busy%,Bzy_MHz,IRQ,PkgTmp,PkgWatt,GFXWatt
...
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0.125000 Watts, 0.000061 Joules, 0.000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x000002f8 (95 W TDP, RAPL 0 - 0 W, 0.000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x4283e800dd8190 (UNlocked)
cpu0: PKG Limit #1: ENabled (50.000000 Watts, 28.000000 sec, clamp ENabled)
cpu0: PKG Limit #2: ENabled (125.000000 Watts, 0.002441* sec, clamp DISabled)
... And now test it:
Avg_MHz Busy%   Bzy_MHz IRQ     PkgTmp  PkgWatt GFXWatt
0       0.02    921     205     29      1.90    0.00
0       0.03    834     195     29      1.90    0.00
14      0.42    3440    384     29      2.06    0.00
0       0.03    800     196     29      1.90    0.00
0       0.03    812     190     29      1.90    0.00
0       0.03    800     212     29      1.90    0.00  <<< System idle
0       0.03    811     204     29      1.90    0.00
3148    72.23   4358    9875    63      97.48   0.00  <<< Heavy load applied
3612    82.93   4355    11226   65      111.60  0.00  <<< Lots of power being used
3609    82.94   4351    11182   65      111.50  0.00
3120    83.35   3743    11145   45      72.32   0.00
2833    83.58   3389    11141   45      49.79   0.00  <<< Power limited to 50 watts
2838    83.58   3395    11179   45      49.85   0.00
2836    83.58   3393    11191   45      49.89   0.00
2837    83.58   3394    11119   46      49.90   0.00
2839    83.58   3397    11160   46      49.94   0.00
2838    83.58   3395    11148   46      49.91   0.00
2838    83.58   3395    11160   46      49.94   0.00
2838    83.58   3395    11284   46      49.94   0.00
654     19.28   3390    2807    32      12.97   0.00
0       0.03    803     202     32      1.90    0.00
0       0.03    802     172     32      1.90    0.00
Run Code Online (Sandbox Code Playgroud)

参考:英特尔SDM

方法二

实际上有一个更简单的方法:

看一下是否可以使用该方法:

doug@s18:~$ grep . /sys/class/powercap/intel-rapl/intel-rapl:0/*
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_max_power_uw:95000000
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_name:long_term
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw:100000000
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_time_window_us:27983872
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_max_power_uw:0
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_name:short_term
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_power_limit_uw:125000000
/sys/class/powercap/intel-rapl/intel-rapl:0/constraint_1_time_window_us:2440
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/device: Is a directory
/sys/class/powercap/intel-rapl/intel-rapl:0/enabled:1
/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj:259409601961
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/intel-rapl:0:0: Is a directory
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/intel-rapl:0:1: Is a directory
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/intel-rapl:0:2: Is a directory
/sys/class/powercap/intel-rapl/intel-rapl:0/max_energy_range_uj:262143328850
/sys/class/powercap/intel-rapl/intel-rapl:0/name:package-0
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/power: Is a directory
grep: /sys/class/powercap/intel-rapl/intel-rapl:0/subsystem: Is a directory
Run Code Online (Sandbox Code Playgroud)

请注意启用线和当前值(与上面相同):

    /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw:100000000
/sys/class/powercap/intel-rapl/intel-rapl:0/enabled:1
Run Code Online (Sandbox Code Playgroud)

现在更改它并检查:

doug@s18:~$ echo "93500000" | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
doug@s18:~$ cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
93500000
Run Code Online (Sandbox Code Playgroud)

并检查涡轮稳定器:

doug@s18:~$ sudo ./turbostat --Summary --interval 5 --show Avg_MHz,Busy%,Bzy_MHz,IRQ,PkgTmp,PkgWatt,GFXWatt
...
cpu0: MSR_PKG_POWER_LIMIT: 0x4203e800dc82ec (UNlocked)
cpu0: PKG Limit #1: ENabled (93.500000 Watts, 28.000000 sec, clamp DISabled)
...
Run Code Online (Sandbox Code Playgroud)

请注意,在另一台计算机上,即使处理器已解锁并且位置显示为根可写,此内容也不起作用(两种方法):

doug@s15:~$ ls -l /sys/class/powercap/intel-rapl/intel-rapl:0/enabled
-rw-r--r-- 1 root root 4096 Apr 26 08:00 /sys/class/powercap/intel-rapl/intel-rapl:0/enabled
doug@s15:~$ echo 1 | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/enabled
1
tee: '/sys/class/powercap/intel-rapl/intel-rapl:0/enabled': Function not implemented
Run Code Online (Sandbox Code Playgroud)