Computer CPU Frequency not scaling high enough when needed - Ubuntu 20.04
this is an issue I've been dealing with since I started using this laptop 2 weeks ago.
The Issue
My CPU frequency isn't scaling high enough to deal with load. I'll regularly be on video calls, be loading lot of tabs open in a browser, or working on some other CPU intensive and start to experience a lot of lag. All the cores will be high load (>50% util) but the CPU clock will stay ~1.8 GHz - ~2.5GHz.
For example, I just ran stress --cpu 8
for about 10 minutes and my clock speed held between 1.5 GHz - 2 GHz. I was monitoring the clock speed before I started the test and it was jumping from .9GHz to 3.7GHz without much load. The second I canceled the stress test I watched the frequency jump to 3GHz.
CPU Temp stays ~65C under load.
I'm using Conky to monitor all my CPU cores and CPU clock of core 1.
Hardware/Kernal Details:
- Make: Thinkpad x1 carbon
- CPU
$ lshw
...
*-cpu
product: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
size: 2972MHz
capacity: 4900MHz
width: 64 bits
capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp x86-64 constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d arch_capabilities cpufreq
- Kernal
$ uname -r
5.6.0-1052-oem
Output from turbostat under load with lag
$ sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt --interval 6
Busy% Bzy_MHz IRQ PkgTmp PkgWatt GFXWatt RAMWatt
55.37 1352 98119 57 10.97 2.37 3.75
53.43 1414 132465 56 11.17 2.36 3.55
49.71 1470 128673 56 11.42 2.45 3.56
50.21 1455 129684 56 11.31 2.43 3.60
41.15 2492 131557 62 20.13 3.82 3.78
39.81 2561 131130 64 20.70 3.85 3.76
41.53 2407 131378 66 19.57 4.31 3.81
41.78 2492 131734 64 20.28 3.91 3.83
41.48 2452 130806 68 19.88 4.14 3.85
47.94 1938 130603 62 16.43 3.46 3.82
68.25 1171 129429 61 10.26 2.19 3.96
64.86 1216 131459 61 10.35 2.21 3.86
56.14 1354 129995 60 10.97 2.35 3.72
54.51 1356 129416 60 10.99 2.40 3.66
63.16 1267 129485 59 10.71 2.33 3.87
58.73 1311 132553 59 10.91 2.38 3.83
61.86 1288 131903 59 10.73 2.27 3.81
55.82 1339 128049 58 10.96 2.42 3.76
62.74 1281 129955 59 10.71 2.32 3.80
57.96 1333 128945 58 10.97 2.41 3.79
61.43 1273 129570 58 10.72 2.38 3.86
62.81 1288 130978 58 10.78 2.32 3.90
62.85 1258 128470 58 10.66 2.34 3.89
55.01 1340 127076 58 10.96 2.41 3.77
57.68 1321 127928 58 10.95 2.44 3.80
57.93 1312 127952 57 10.90 2.41 3.80
54.89 1389 129539 58 11.23 2.45 3.74
60.54 1277 129562 57 10.73 2.35 3.89
61.12 1291 128635 57 10.89 2.37 3.91
60.87 1309 129185 57 10.86 2.33 3.83
58.57 1319 129387 57 10.97 2.40 3.85
Things I've tried
- apt update && apt upgrade
- cpupower frequency-set --governor performance
I am considering trying a kernel upgrade but wanted to ask here first.
EDIT 1: adding turbostat output with light load:
$ sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt --interval 6
Busy% Bzy_MHz IRQ PkgTmp PkgWatt GFXWatt RAMWatt
4.27 4513 15448 61 15.52 0.03 0.81
4.47 4514 9967 70 15.90 0.02 0.82
3.23 4573 10277 88 14.04 0.02 0.78
3.63 4573 9790 95 14.85 0.03 0.79
2.86 4683 7478 88 14.30 0.03 0.79
4.80 4469 10917 67 16.06 0.09 0.87
8.90 4429 20269 59 25.62 0.68 1.61
EDIT 2: The laptop was sitting closed on the desktop driving 2 monitors. It was reworked and is now on a raised stand that allows much better. It also only had 1 external monitor for the lest few days. No throttling issues. Second monitor has now been added again. I will report back if the issue returns:
Busy% Bzy_MHz IRQ PkgTmp PkgWatt GFXWatt RAMWatt
13.33 2847 87808 62 15.33 1.12 2.44
14.58 2830 88613 61 15.60 1.15 2.45
22.07 2252 90592 58 13.34 2.07 2.75
22.01 2229 91650 58 13.24 2.24 2.77
Solution 1:
Please know that processor energy consumption is highly non-linear in the upper CPU frequency range. My processor (i5-10600K) is similar enough to yours to provide a relevant example. I'll load only 1 CPU with the prime95 highest heat torture test, and sweep the maximum CPU frequency from minimum to maximum gradually over the test time:
doug@s19:~$ sudo /home/doug/temp-k-git/linux/tools/power/x86/turbostat/turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt --interval 15
Busy% Bzy_MHz IRQ PkgTmp PkgWatt GFXWatt RAMWatt
8.85 800 22017 35 2.21 0.00 0.89
8.83 890 21963 35 2.31 0.00 0.89
8.77 993 21810 35 2.48 0.00 0.89
8.81 1192 22103 35 2.83 0.00 0.89
8.84 1482 22287 35 3.70 0.00 0.89
8.93 1692 22300 35 4.32 0.00 0.89
8.94 1991 22429 36 5.31 0.00 0.89
9.07 2192 22207 37 6.23 0.00 0.89
9.12 2392 18979 37 6.97 0.00 0.89
9.12 2689 18247 39 8.40 0.00 0.89
9.18 2892 18159 40 9.57 0.00 0.89
9.17 3180 18277 41 11.77 0.00 0.89
9.10 3387 17853 42 13.21 0.00 0.89
9.15 3589 18162 43 15.15 0.00 0.89
9.20 3889 18248 47 19.15 0.00 0.89
9.05 4092 17910 50 22.42 0.00 0.89
9.21 4389 18033 54 28.01 0.00 0.89
9.06 4588 18081 59 33.60 0.00 0.89
9.20 4792 18095 63 39.60 0.00 0.89
9.14 4800 17791 64 39.65 0.00 0.89
9.26 4800 17620 64 40.09 0.00 0.89
9.02 4800 18045 64 40.03 0.00 0.89
9.15 4800 17974 64 40.11 0.00 0.89
Notice even with just one loaded CPU it ended up at 40 watts processor package power at the highest CPU frequency, well above what your processor is capable of. Even the temperature is rather high for a water cooled system. Why? Because of the highly focused heat source. It should be noted, that my radiator cooling fan hasn't even begun to spin up.
Now, lets try again, with 8 CPUs loaded, since that is what you have:
doug@s19:~$ sudo /home/doug/temp-k-git/linux/tools/power/x86/turbostat/turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt --interval 15
Busy% Bzy_MHz IRQ PkgTmp PkgWatt GFXWatt RAMWatt
66.63 800 130786 37 7.27 0.00 0.89
66.64 987 131850 37 8.44 0.00 0.89
66.62 1177 130848 37 10.16 0.00 0.89
66.59 1483 130346 39 13.60 0.00 0.89
66.58 1690 129868 39 15.96 0.00 0.89
66.57 1989 129622 41 19.91 0.00 0.89
66.56 2189 130280 41 22.92 0.00 0.89
66.56 2390 130588 42 25.86 0.00 0.89
66.55 2688 129897 44 31.89 0.00 0.89
66.54 2700 130524 44 32.41 0.00 0.89
66.55 2884 129650 46 36.63 0.00 0.89
66.54 3187 130104 48 44.98 0.00 0.89
66.54 3391 130259 50 51.37 0.00 0.89
66.54 3587 131023 52 58.51 0.00 0.89
66.54 3882 130983 57 73.29 0.00 0.89
66.54 4092 129813 60 85.79 0.00 0.89
66.53 4347 129923 66 103.83 0.00 0.89
66.53 4588 129581 73 126.47 0.00 0.89
66.35 4575 129285 73 125.49 0.00 0.89
66.44 4580 129205 73 124.91 0.00 0.89
66.43 4579 129734 74 124.90 0.00 0.89
Notice the huge power steps at high CPU frequency verses low frequency (even though the was frequency was swept manually, the timing was pretty close).
Also notice the default power limit for your processor was at around 1.7 GHz. the prime95 torture test is very brutal, typical use should get more before throttling.
Side Note: the example processor is power limit throttling for the last 3 samples.
Conclusion: Your processor is throttling appropriately to protect itself.