Problema:
Acum câteva luni, am primit un nou laptop de gaming MSI (GP76 Leopard w/Intel Core i7-10870H și Nvidia RTX 3070).
Totuși, încă de la început, am avut un comportament foarte enervant: procesorul o ia razna prea des, de aici și ventilatoarele, și fără un motiv întemeiat.
Soluție:
Am rezolvat această problemă pur și simplu dezactivând Intel Turbo BoostA :
echo 1 >/sys/devices/system/cpu/intel_pstate/no_turbo
Iată două ieşiri de jurnal ale turbostat --Summary --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt,CorWatt --interval 6
, cu Turbo Boost dezactivat/activat pentru aceeași sarcină care nu este foarte solicitantă.
Turbo Boost dezactivat:
versiunea turbostat 20.09.30 - Len Brown <[email protected]>
CPUID(0): niveluri CPUID GenuineIntel 0x16; 0x80000008 xniveluri; family:model:stepping 0x6:a5:2 (6:165:2)
CPUID(1): SSE3 MONITOR - EIST TM2 TSC MSR ACPI-TM HT TM
CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB
cpu2: MSR_IA32_MISC_ENABLE: 0x00850089 (TCC EIST MWAIT PREFETCH TURBO)
CPUID(7): SGX
cpu2: MSR_IA32_FEATURE_CONTROL: 0x00020005 (Blocat)
CPUID(0x15): eax_crystal: 2 ebx_tsc: 184 ecx_crystal_hz: 0
TSC: 2208 MHz (24000000 Hz * 184 / 2 / 1000000)
CPUID(0x16): baza_mhz: 2200 max_mhz: 5000 bus_mhz: 100
cpu2: MSR_MISC_PWR_MGMT: 0x00401cc0 (ENable-EIST_Coordination DISable-EPB DISable-OOB)
RAPL: 5825 sec. Gama de contor Joule, la 45 W
cpu2: MSR_PLATFORM_INFO: 0x8083bf1011600
8 * 100.0 = 800.0 MHz frecvență maximă de eficiență
22 * 100,0 = 2200,0 MHz frecvență de bază
cpu2: MSR_IA32_POWER_CTL: 0x003c005f (promovare automată C1E: activată)
cpu2: MSR_TURBO_RATIO_LIMIT: 0x292b2c2d2e2f3132
41 * 100.0 = 4100.0 MHz max turbo 8 nuclee active
43 * 100.0 = 4300.0 MHz max turbo 7 nuclee active
44 * 100.0 = 4400.0 MHz max turbo 6 nuclee active
45 * 100.0 = 4500.0 MHz max turbo 5 nuclee active
46 * 100.0 = 4600.0 MHz max turbo 4 nuclee active
47 * 100.0 = 4700.0 MHz max turbo 3 nuclee active
49 * 100.0 = 4900.0 MHz max turbo 2 nuclee active
50 * 100.0 = 5000.0 MHz max turbo 1 nuclee active
cpu2: MSR_CONFIG_TDP_NOMINAL: 0x00000016 (base_ratio=22)
cpu2: MSR_CONFIG_TDP_LEVEL_1: 0x00120118 (PKG_MIN_PWR_LVL1=0 PKG_MAX_PWR_LVL1=0 LVL1_RATIO=18 PKG_TDP_LVL1=280)
CPU2: MSR_CONFIG_TDP_LEVEL_2: 0x00000000 ()
cpu2: MSR_CONFIG_TDP_CONTROL: 0x00000000 ( lock=0)
cpu2: MSR_TURBO_ACTIVATION_RATIO: 0x00000015 (MAX_NON_TURBO_RATIO=21 blocare=0)
cpu2: MSR_PKG_CST_CONFIG_CONTROL: 0x1e008008 (UNdemote-C3, UNdemote-C1, demote-C3, demote-C1, blocat, pkg-cstate-limit=8 (nelimitat))
/dev/cpu_dma_latency: 2000000000 usec (implicit)
driver_actual: intel_idle
actual_governor: meniu
current_governor_ro: meniu
cpu2: POLL: CPUIDLE CORE POLL IDLE
cpu2: C1ACPI: ACPI FFH MWAIT 0x0
cpu2: C2ACPI: ACPI FFH MWAIT 0x33
cpu2: C3ACPI: ACPI FFH MWAIT 0x60
cpu2: driver cpufreq: intel_pstate
cpu2: cpufreq guvernator: powersave
cpufreq intel_pstate no_turbo: 1
cpu2: MSR_MISC_FEATURE_CONTROL: 0x00000000 (L2-Prefetch L2-Prefetch-pereche L1-Prefetch L1-IP-Prefetch)
cpu0: MSR_PM_ENABLE: 0x00000001 (HWP)
cpu0: MSR_HWP_CAPABILITIES: 0x01081632 (high 50 guar 22 eff 8 low 1)
cpu0: MSR_HWP_REQUEST: 0x80001608 (min 8 max 22 des 0 epp 0x80 window 0x0 pkg 0x0)
cpu0: MSR_HWP_INTERRUPT: 0x00000000 (Dis_Guaranteed_Perf_Change, Dis_Excursion_Min)
cpu0: MSR_HWP_STATUS: 0x00000000 (No-Guaranteed_Perf_Change, No-Excursion_Min)
cpu0: EPB: 6 (echilibrat)
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0,125000 wați, 0,000061 jouli, 0,000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x00000168 (45 W TDP, RAPL 0 - 0 W, 0,000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x43864000df8640 (dezblocat)
cpu0: Limita PKG #1: Activată (200,000000 W, 56,000000 sec, clemă activată)
cpu0: Limita PKG #2: Activată (200,000000 Watt, 0,002441* sec, clemă activată)
cpu0: MSR_DRAM_POWER_LIMIT: 0x5400de00000000 (dezblocat)
cpu0: Limită DRAM: Dezactivată (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_PP0_POLICY: 0
cpu0: MSR_PP0_POWER_LIMIT: 0x00000000 (dezblocat)
cpu0: Limită de nuclee: Dezactivat (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_PP1_POLICY: 0
cpu0: MSR_PP1_POWER_LIMIT: 0x00000000 (dezblocat)
cpu0: Limită GFX: Dezactivat (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_IA32_TEMPERATURE_TARGET: 0x05640000 (100 C)
cpu0: MSR_IA32_PACKAGE_THERM_STATUS: 0x88380000 (44 C)
cpu0: MSR_IA32_PACKAGE_THERM_INTERRUPT: 0x00000003 (100 C, 100 C)
cpu2: MSR_PKGC3_IRTL: 0x0000884e (valid, 79872 ns)
cpu2: MSR_PKGC6_IRTL: 0x00008876 (valid, 120832 ns)
cpu2: MSR_PKGC7_IRTL: 0x00008894 (valid, 151552 ns)
cpu2: MSR_PKGC8_IRTL: 0x000088fa (valid, 256000 ns)
cpu2: MSR_PKGC9_IRTL: 0x0000894c (valid, 339968 ns)
cpu2: MSR_PKGC10_IRTL: 0x00008bf2 (valid, 1034240 ns)
Ocupat % Bzy_MHz IRQ PkgTmp PkgWatt CorWatt GFXWatt RAMWatt
3,50 2034 6940 44 6,56 1,70 0,00 0,76
3,55 1446 9321 45 4,96 1,08 0,00 0,90
4,60 1361 11377 45 5,07 1,29 0,00 1,02
6,91 2080 17822 50 7,85 3,26 0,00 0,85
6,84 2196 10866 50 9,36 3,72 0,00 0,85
7,01 2185 11353 50 8,50 3,79 0,00 0,84
7,27 2196 13078 50 8,80 3,96 0,00 0,84
7,36 2200 10385 49 10,00 4,12 0,00 0,84
7,27 2200 11124 49 7,43 4,17 0,00 0,84
7,24 2200 10872 49 7,37 4,11 0,00 0,84
7,27 2200 10866 50 7,34 4,08 0,00 0,84
7,25 2186 10891 50 7,21 3,95 0,00 0,84
7,29 2200 11188 50 7,27 4,01 0,00 0,84
7,24 2200 11702 49 7,30 4,03 0,00 0,84
7,28 2200 11692 50 7,35 4,08 0,00 0,84
7,26 2200 11515 50 7,31 4,05 0,00 0,84
7,26 2200 11103 50 7,32 4,05 0,00 0,84
7,35 2200 13125 50 7,38 4,12 0,00 0,84
7,62 2200 18003 50 7,56 4,29 0,00 0,85
7,15 2145 14333 47 7,13 3,85 0,00 0,86
1,64 1839 4533 45 6,88 0,68 0,00 0,76
1,45 1830 2615 46 7,60 0,58 0,00 0,74
ÎNAINTE (Turbo Boost activat):
versiunea turbostat 20.09.30 - Len Brown <[email protected]>
CPUID(0): niveluri CPUID GenuineIntel 0x16; 0x80000008 xniveluri; family:model:stepping 0x6:a5:2 (6:165:2)
CPUID(1): SSE3 MONITOR - EIST TM2 TSC MSR ACPI-TM HT TM
CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB
cpu10: MSR_IA32_MISC_ENABLE: 0x00850089 (TCC EIST MWAIT PREFETCH TURBO)
CPUID(7): SGX
cpu10: MSR_IA32_FEATURE_CONTROL: 0x00020005 (Blocat)
CPUID(0x15): eax_crystal: 2 ebx_tsc: 184 ecx_crystal_hz: 0
TSC: 2208 MHz (24000000 Hz * 184 / 2 / 1000000)
CPUID(0x16): baza_mhz: 2200 max_mhz: 5000 bus_mhz: 100
cpu10: MSR_MISC_PWR_MGMT: 0x00401cc0 (ENable-EIST_Coordination DISable-EPB DISable-OOB)
RAPL: 5825 sec. Gama de contor Joule, la 45 W
cpu10: MSR_PLATFORM_INFO: 0x8083bf1011600
8 * 100.0 = 800.0 MHz frecvență maximă de eficiență
22 * 100,0 = 2200,0 MHz frecvență de bază
cpu10: MSR_IA32_POWER_CTL: 0x003c005f (promovare automată C1E: activată)
cpu10: MSR_TURBO_RATIO_LIMIT: 0x292b2c2d2e2f3132
41 * 100.0 = 4100.0 MHz max turbo 8 nuclee active
43 * 100.0 = 4300.0 MHz max turbo 7 nuclee active
44 * 100.0 = 4400.0 MHz max turbo 6 nuclee active
45 * 100.0 = 4500.0 MHz max turbo 5 nuclee active
46 * 100.0 = 4600.0 MHz max turbo 4 nuclee active
47 * 100.0 = 4700.0 MHz max turbo 3 nuclee active
49 * 100.0 = 4900.0 MHz max turbo 2 nuclee active
50 * 100.0 = 5000.0 MHz max turbo 1 nuclee active
cpu10: MSR_CONFIG_TDP_NOMINAL: 0x00000016 (base_ratio=22)
cpu10: MSR_CONFIG_TDP_LEVEL_1: 0x00120118 (PKG_MIN_PWR_LVL1=0 PKG_MAX_PWR_LVL1=0 LVL1_RATIO=18 PKG_TDP_LVL1=280)
cpu10: MSR_CONFIG_TDP_LEVEL_2: 0x00000000 ()
cpu10: MSR_CONFIG_TDP_CONTROL: 0x00000000 (blocare=0)
cpu10: MSR_TURBO_ACTIVATION_RATIO: 0x00000015 (MAX_NON_TURBO_RATIO=21 blocare=0)
cpu10: MSR_PKG_CST_CONFIG_CONTROL: 0x1e008008 (UNdemote-C3, UNdemote-C1, demote-C3, demote-C1, blocat, pkg-cstate-limit=8 (nelimitat))
/dev/cpu_dma_latency: 2000000000 usec (implicit)
driver_actual: intel_idle
actual_governor: meniu
current_governor_ro: meniu
cpu10: POLL: CPUIDLE CORE POLL IDLE
cpu10: C1ACPI: ACPI FFH MWAIT 0x0
cpu10: C2ACPI: ACPI FFH MWAIT 0x33
cpu10: C3ACPI: ACPI FFH MWAIT 0x60
cpu10: driver cpufreq: intel_pstate
cpu10: cpufreq guvernator: powersave
cpufreq intel_pstate no_turbo: 0
cpu10: MSR_MISC_FEATURE_CONTROL: 0x00000000 (L2-Prefetch L2-Prefetch-pereche L1-Prefetch L1-IP-Prefetch)
cpu0: MSR_PM_ENABLE: 0x00000001 (HWP)
cpu0: MSR_HWP_CAPABILITIES: 0x01081632 (high 50 guar 22 eff 8 low 1)
cpu0: MSR_HWP_REQUEST: 0x80003208 (min 8 max 50 des 0 epp 0x80 window 0x0 pkg 0x0)
cpu0: MSR_HWP_INTERRUPT: 0x00000000 (Dis_Guaranteed_Perf_Change, Dis_Excursion_Min)
cpu0: MSR_HWP_STATUS: 0x00000000 (No-Guaranteed_Perf_Change, No-Excursion_Min)
cpu0: EPB: 6 (echilibrat)
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0,125000 wați, 0,000061 jouli, 0,000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x00000168 (45 W TDP, RAPL 0 - 0 W, 0,000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x43864000df8640 (dezblocat)
cpu0: Limita PKG #1: Activată (200,000000 W, 56,000000 sec, clemă activată)
cpu0: Limita PKG #2: Activată (200,000000 Watt, 0,002441* sec, clemă activată)
cpu0: MSR_DRAM_POWER_LIMIT: 0x5400de00000000 (dezblocat)
cpu0: Limită DRAM: Dezactivată (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_PP0_POLICY: 0
cpu0: MSR_PP0_POWER_LIMIT: 0x00000000 (DEBLOCAT)
cpu0: Limită de nuclee: Dezactivat (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_PP1_POLICY: 0
cpu0: MSR_PP1_POWER_LIMIT: 0x00000000 (dezblocat)
cpu0: Limită GFX: Dezactivat (0,000000 Watt, 0,000977 sec, clemă dezactivată)
cpu0: MSR_IA32_TEMPERATURE_TARGET: 0x05640000 (100 C)
cpu0: MSR_IA32_PACKAGE_THERM_STATUS: 0x88370000 (45 C)
cpu0: MSR_IA32_PACKAGE_THERM_INTERRUPT: 0x00000003 (100 C, 100 C)
cpu10: MSR_PKGC3_IRTL: 0x0000884e (valid, 79872 ns)
cpu10: MSR_PKGC6_IRTL: 0x00008876 (valid, 120832 ns)
cpu10: MSR_PKGC7_IRTL: 0x00008894 (valid, 151552 ns)
cpu10: MSR_PKGC8_IRTL: 0x000088fa (valid, 256000 ns)
cpu10: MSR_PKGC9_IRTL: 0x0000894c (valid, 339968 ns)
cpu10: MSR_PKGC10_IRTL: 0x00008bf2 (valid, 1034240 ns)
Ocupat % Bzy_MHz IRQ PkgTmp PkgWatt CorWatt GFXWatt RAMWatt
1,88 3641 5797 43 10,07 4,34 0,00 0,75
2,61 1697 7673 42 6,49 1,79 0,00 0,88
4,35 2100 15882 68 8,27 4,20 0,00 0,97
5,19 2608 15240 42 11,41 7,50 0,00 0,90
5,45 3552 11849 66 17,01 11,81 0,00 0,88
6,21 4349 11560 77 21,86 17,17 0,00 0,84
7,14 4489 13990 79 26,32 21,18 0,00 0,89
6,48 4621 11100 79 25,58 20,96 0,00 0,84
6,49 4684 10883 81 26,02 21,41 0,00 0,84
6,47 4609 10874 81 25,73 20,99 0,00 0,84
6,45 4388 11430 78 24,04 19,43 0,00 0,85
6,47 4551 11377 76 25,07 20,44 0,00 0,84
6,50 4668 10891 80 25,98 21,25 0,00 0,84
6,43 4433 11053 80 24,43 19,80 0,00 0,85
6,47 4588 11079 79 25,59 20,86 0,00 0,84
6,52 4688 10827 82 26,35 21,61 0,00 0,84
6,52 4689 11453 82 26,27 21,64 0,00 0,84
6,72 4684 18989 76 27,30 22,66 0,00 0,84
6,53 4457 15215 82 26,02 21,28 0,00 0,85
2,97 3515 9289 46 12,27 6,32 0,00 0,82
0,32 942 1432 44 7,17 0,18 0,00 0,73
1,73 3185 2361 45 10,26 3,19 0,00 0,75
Acest lucru a funcționat bine, procesorul meu este foarte calm, dar în timp ce joc unele jocuri, acum întâlnesc încetiniri/scăderi FPS chiar și în situațiile în care totul a fost bine pe vechiul meu laptop din 2014. Desigur, este inacceptabil.
Cercetarea mea până acum:
Am avut aceeași problemă și pe Windows când a fost instalat din nou și la instalare Centrul Dragonului (un utilitar specific MSI numai pentru Windows) a rezolvat problema. După ce am săpat câteva informații, se pare că are legătură cu ceva ce apelează MSI Tehnologia MSI Shift cu care cred că este strâns legată Intel SpeedStep.
După ce am săpat și mai mult, se pare că este gestionat prin controlerul încorporat al laptopului, scriind la adresa de memorie EC 0xD2 în felul acesta :
- Bit 7 ar trebui să fie întotdeauna 1.
- Bit 6 ar trebui să fie 1 dacă MSI shift este activat, 0 în caz contrar.
- Biții 5, 4, 3 sunt neutilizați (setati la zero).
- Biții 2, 1, 0 ar trebui setați în funcție de nivelul de performanță necesar, conform următoarelor:
- 010Â : Economie (scăzută)
- 001 : verde (mediu)
- 000Â : Confort (înalt)
- 100Â : Sport (Turbo)
- 011Â : definit de utilizator
Așa că am scris un modul care face exact asta, dar nu pare să schimbe nimic. Evident că îmi lipsește ceva, dar trebuie să fiu aproape. Iată un modul simplu care ar trebui să seteze performanța procesorului în modul baterie, dar așa cum am spus, nu funcționează (deși nu sunt de departe un codator experimentat în modul kernel, nu cred că există greșeli mari aici, deoarece am utilizați un cod similar pentru a activa/dezactiva cu succes overdrive de afișare) :
#include <linux/kernel.h>
#include <linux/acpi.h>
#include <linux/module.h>
MODULE_AUTHOR ("NovHak <[email protected]>");
MODULE_DESCRIPTION("MSI GP76 ACPI EC fiddler (baterie)");
MODULE_LICENSE("GPL");
static int __init acpi_msiecbt_init(void)
{
u8 byte_read;
int err = 0;
err = ec_read(0xd2, &byte_read);
dacă (eră)
{
pr_notice("Eroare de citire %d\n", err);
returnează 0;
}
altfel
pr_info("Valoarea citită: %x\n", byte_read);
byte_read = 0xc2;
err = ec_write(0xd2, byte_read);
dacă (eră)
pr_notice("Eroare de scriere %d\n", err);
altfel
pr_info("Valoare scrisă: %x (modul bateriei activat)\n", byte_read);
returnează 0;
}
static void __exit acpi_msiecbt_exit(void)
{
întoarcere;
}
module_init(acpi_msiecbt_init);
module_exit(acpi_msiecbt_exit);
O altă opțiune ar fi, desigur, abordarea generală de a încerca în mod direct registrele CPU MSR, dar bănuiesc că pot avea câteva surprize, deoarece pot exista motive pentru care MSI a făcut acest lucru prin EC.
Cercetari suplimentare:
Soluția de compensare TCC:
Documentația de referință poate fi găsită Aici, registrul este definit în volumul 4 al manualelor : Registre specifice modelului
ATENȚIE, execuția necorespunzătoare poate să vă blocheze sistemul sau chiar să vă deterioreze hardware-ul
Am acum o altă soluție (mulțumesc Doug Smythies) care constă în scăderea limitei de temperatură a procesorului, prin modificarea MSR_TEMPERATURE_TARGET
(adresa 0x1a2) înregistrare. Biții de la 23 la 16 conțin temperatura țintă, în grade Celsius, aceasta este cea mai scăzută temperatură la care semnalul PROCHOT# va fi întotdeauna afirmat. Această limită poate fi redusă printr-un offset care poate fi scris de la biții 29 la 24. (În funcție de sistemul dvs., acea valoare poate fi disponibilă pentru modificare în setările BIOS-ului, în cazul în care nu vă place scrierea MSR brută)
Cum să faci asta: trebuie să folosești rdmsr
și wrmsr
comenzi:
- Asigurați-vă că Secure Boot este dezactivată. În caz contrar, nu veți putea efectua scrieri brute în registrul MSR.
- Fii root sau pregătește-te să folosești sudo în mod obișnuit.
- (opțional) Executați
rdmsr -d -f 23:16 0x1a2
pentru a obține temperatura țintă a pachetului CPU.
- (opțional) Executați
rdmsr -d -f 29:24 0x1a2
pentru a obține compensarea curentă de activare a TCC.
- A executa
rdmsr 0x1a2
pentru a obține întregul conținut al registrului, în hex. Să presupunem că este 5640000
. Biții 29 până la 24 sunt 5 hex (5 zecimale), biții 23 până la 16 sunt 64 hex (100 zecimale), prin urmare limita actuală de temperatură este 100-5=95°C. Să presupunem că doriți să reduceți limita de temperatură la 75°C, deci o compensare de 25°C (19 hex). Noua valoare a registrului, în hex, ar trebui să fie atunci 19640000.
- A executa
wrmsr 0x1a2 0x19640000
.
- Temperatura țintă este acum de 75°C.
Deși a funcționat bine, fanii sunt mai calmi și nu întâmpin încetiniri, aceasta este doar o soluție, deoarece procesorul meu rămâne apoi la 75°C pe toată durata sesiunii de joc, ceea ce este încă mult prea fierbinte având în vedere sarcina.