Nicht Werbeeinblendung im Sinne von Advertisement. Sondern Hinweis im Sinne von hey deine Archtektur unterstützt eine zusätzhliche feingranulare Regelung von Lastverschiebung auf spezifische Cores bei geringer Auslastung mit nem kurzen!! Hinweis auf die manpage oder das Github. Es ist immerhin ein offizielles Intel-Tool für deren aktuelle CPU-Architekturen die sich seit circa 3 Jahren mehr und mehr verbreiten. Der Daemon ist in den Repos von großen Distributionen wie Ubuntu, Debian oder Fedora inzwischen verfügbar.
Du hast mit TLP das Tool das Energie-Spar-Tool welches beinahe auf jedem Linux läuft.
Es könnte für den ein oder anderen ein Hinweis sein der Meteor/Panther/Lunar hat sich das mal anzuschauen. Die kommentierten Configs des Tools sind so schlimm nicht zu verstehen. Die Manpages sind so furchtbar nicht. Man könnte evtl. sogar über den Wert intel_lpmd_control in einer tlp.conf die paramter aus intel_lpmd_config.xml schalten und somit Paramter des intel low power daemon an einzelne betriebszustände von tlp binden.
Ja es sollte definitiv aus dem User-Space in den Kernel. So wie ich das lese versucht man das auch
Ja ich habe grob verstanden was das macht ich kann über config Schwellenwerte definieren was für mich geringe Auslastung ist und dann Aufgaben während der geringen Auslastung gezielt auf die von mir festgelegten energieffizenten CPU-Kernen verlagern um Stromverbrauch zu senken. Gleichzeitig kann ich das für drei Betriebszustände tun Performance balance und Powersaver.
Danke für den Hinweis in der TLP-Doku

Das hab ich auch voll übersehen.
@linrunner
ich habe weiter mit lpmd experimentiert. Tatsächlich glaube ich das du in deiner FAQ ändern müsstest. Es kommt u.U. zu gegenseitigen Beinflussungen. Lpmd kann ebenfalls epp profile setzen und macht das u.a. sehr dynamisch. Ich kann es so feingranular einstellen das es je nach CPU Last zwischen Power, Balance-Power uswm. switcht. Das ist m.E. ein Konflikt zu TLP wenn man diese da auch "fix" setzt. Keine Ahnung ob man das dann in der Praxis merken wird wenn da zwei Tools gegeneinander arbeiten aber sinnvoll ist es wohl nicht.
Code:
cat /etc/intel_lpmd/intel_lpmd_config_F6_M170.xml
<?xml version="1.0"?>
<!--
Specifies the configuration data
for Intel Energy Optimizer (LPMD) daemon
Proxy WLT enabled with MTL specific epp values.
-->
<Configuration>
<!--
CPU format example: 1,2,4..6,8-10
-->
<lp_mode_cpus>12-13</lp_mode_cpus>
<!--
Mode values
0: Cgroup v2
1: Cgroup v2 isolate
2: CPU idle injection
-->
<Mode>0</Mode>
<!--
Default behavior when Performance power setting is used
-1: force off. (Never enter Low Power Mode)
1: force on. (Always stay in Low Power Mode)
0: auto. (opportunistic Low Power Mode enter/exit)
-->
<PerformanceDef>-1</PerformanceDef>
<!--
Default behavior when Balanced power setting is used
-1: force off. (Never enter Low Power Mode)
1: force on. (Always stay in Low Power Mode)
0: auto. (opportunistic Low Power Mode enter/exit)
-->
<BalancedDef>0</BalancedDef>
<!--
Default behavior when Power saver setting is used
-1: force off. (Never enter Low Power Mode)
1: force on. (Always stay in Low Power Mode)
0: auto. (opportunistic Low Power Mode enter/exit)
-->
<PowersaverDef>1</PowersaverDef>
<!--
Use HFI LPM hints
0 : No
1 : Yes
-->
<HfiLpmEnable>0</HfiLpmEnable>
<!--
Use WLT hints
0 : No
1 : Yes
-->
<WLTHintEnable>0</WLTHintEnable>
<!--
Use WLT software proxy hints
0 : No
1 : Yes
-->
<WLTProxyEnable>0</WLTProxyEnable>
<!--
Use HFI SUV hints
0 : No
1 : Yes
-->
<HfiSuvEnable>0</HfiSuvEnable>
<!--
System utilization threshold to enter LP mode
from 0 - 100
clear both util_entry_threshold and util_exit_threshold to disable util monitor
-->
<util_entry_threshold>10</util_entry_threshold>
<!--
System utilization threshold to exit LP mode
from 0 - 100
clear both util_entry_threshold and util_exit_threshold to disable util monitor
-->
<util_exit_threshold>40</util_exit_threshold>
<!--
Entry delay. Minimum delay in non Low Power mode to
enter LPM mode.
-->
<EntryDelayMS>50</EntryDelayMS>
<!--
Exit delay. Minimum delay in Low Power mode to
exit LPM mode.
-->
<ExitDelayMS>10</ExitDelayMS>
<!--
Lowest hysteresis average in-LP-mode time in msec to enter LP mode
0: to disable hysteresis support
-->
<EntryHystMS>100</EntryHystMS>
<!--
Lowest hysteresis average out-of-LP-mode time in msec to exit LP mode
0: to disable hysteresis support
-->
<ExitHystMS>50</ExitHystMS>
<!--
Ignore ITMT setting during LP-mode enter/exit
0: disable ITMT upon LP-mode enter and re-enable ITMT upon LP-mode exit
1: do not touch ITMT setting during LP-mode enter/exit
-->
<IgnoreITMT>0</IgnoreITMT>
<States>
<CPUFamily> 6 </CPUFamily>
<CPUModel> 170 </CPUModel>
<CPUConfig> * </CPUConfig>
<State>
<ID> 1 </ID> <!-- no significance. number can be anything -->
<Name> WLT_IDLE </Name>
<WLTType> 0 </WLTType> <!-- WLTType mapped to Name -->
<EPP> 255 </EPP>
<EPB> 15 </EPB>
<MinPollInterval>2000</MinPollInterval>
<ITMTState> -1 </ITMTState>
<IRQMigrate> -1 </IRQMigrate>
</State>
<State>
<ID> 2 </ID>
<Name> WLT_BATTERY_LIFE </Name>
<WLTType> 1 </WLTType>
<EPP> 179 </EPP>
<EPB> 6 </EPB>
<MinPollInterval>2000</MinPollInterval>
<ITMTState> -1 </ITMTState>
<IRQMigrate> -1 </IRQMigrate>
</State>
<State>
<ID> 3 </ID>
<Name> WLT_SUSTAINED </Name>
<WLTType> 2 </WLTType>
<EPP> 179 </EPP>
<EPB> 6 </EPB>
<MinPollInterval>2000</MinPollInterval>
<ITMTState> -1 </ITMTState>
<IRQMigrate> -1 </IRQMigrate>
</State>
<State>
<ID> 4 </ID>
<Name> WLT_BURSTY </Name>
<WLTType> 3 </WLTType>
<EPP> 179 </EPP>
<EPB> 4 </EPB>
<MinPollInterval>2000</MinPollInterval>
<ITMTState> -1 </ITMTState>
<IRQMigrate> -1 </IRQMigrate>
</State>
</States>
</Configuration>
Ich kann das simulieren indem ich z.b. manuell balance power setze
anton@thickpad:~$ echo "balance_power" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference
[sudo: authenticate] Passwort:
balance_power
anton@thickpad:~$
und sich lpmd den wert dann wieder zurück ändert wenn ich die last auf die cpu erhöhe

. also definitiv kontraproduktiv wenn man nicht genau überlegt was man da tut.
Also das ist hoch!!!!! Interessant. Mir war nicht klar wie ich die Zahlenwerte EPP in Einklang mit z.b. power oder so bringe oder wie die dokumentiert sind. Ich hab jetzt ein Python-Skript geschrieben das einfach 0-255 durchprobiert wann Values zu EPP Werten wie balance_performance werden.
Ich stelle vor den EPP Value Mapper

.
Code:
cat epp_mapper.py
#!/usr/bin/env python3
"""EPP Value Mapper - Findet welcher numerische Wert welchem EPP-String entspricht"""
import subprocess
import time
import sys
EPP_PATH = "/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference"
EPP_ALL_PATH = "/sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference"
def read_epp():
with open(EPP_PATH, "r") as f:
return f.read().strip()
def write_epp(value):
result = subprocess.run(
f'echo "{value}" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference > /dev/null',
shell=True
)
return result.returncode == 0
def main():
print("=== EPP Value Mapper ===")
print("Testet numerische Werte 0-255 und zeigt welchem String sie entsprechen\n")
# Zuerst verfügbare Strings anzeigen
try:
with open("/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_available_preferences", "r") as f:
available = f.read().strip()
print(f"Verfügbare EPP-Werte: {available}\n")
except:
print("Konnte verfügbare Werte nicht lesen\n")
# Original-Wert merken
original = read_epp()
print(f"Aktueller EPP-Wert: {original}\n")
# Werte testen - nur Grenzbereiche und markante Werte
test_values = list(range(0, 256, 1))
results = {}
last_string = None
boundaries = {}
print("Scanne alle Werte 0-255...")
for val in test_values:
write_epp(val)
time.sleep(0.05)
current_string = read_epp()
if current_string != last_string:
boundaries[val] = current_string
last_string = current_string
results[val] = current_string
# Original wiederherstellen
write_epp(original)
print("\n=== ERGEBNIS: EPP Mapping ===")
print(f"{'Bereich':<20} {'EPP-String':<25}")
print("-" * 45)
prev_val = 0
prev_string = results[0]
for val in range(1, 256):
if results[val] != prev_string or val == 255:
end_val = val - 1 if results[val] != prev_string else val
print(f"{prev_val}-{end_val:<18} {prev_string}")
prev_val = val
prev_string = results[val]
print("\n=== Grenzen ===")
for boundary_val, string in boundaries.items():
print(f" Ab Wert {boundary_val:>3}: {string}")
# Typische lpmd-Werte
print("\n=== Deine lpmd Config-Werte ===")
for val in [255, 178, 128, 191, 64, 0]:
if val in results:
print(f" EPP {val:>3} = '{results[val]}'")
if __name__ == "__main__":
main()
Was können wir? Hier beispielsweise auf einem Meteorlake System T14G5
Code:
sudo python3 epp_mapper.py
[sudo: authenticate] Passwort:
=== EPP Value Mapper ===
Testet numerische Werte 0-255 und zeigt welchem String sie entsprechen
Verfügbare EPP-Werte: default performance balance_performance balance_power power
Aktueller EPP-Wert: power
Scanne alle Werte 0-255...
=== ERGEBNIS: EPP Mapping ===
Bereich EPP-String
---------------------------------------------
0-0 default
1-1 178
2-2 2
3-3 191
4-4 4
5-5 5
6-6 6
7-7 7
8-8 8
9-9 9
10-10 10
11-11 11
12-12 12
13-13 13
14-14 14
15-15 15
16-16 performance
17-17 17
18-18 18
19-19 19
20-20 20
21-21 21
22-22 22
23-23 23
24-24 24
25-25 25
26-26 26
27-27 27
28-28 28
29-29 29
30-30 30
31-31 31
32-32 32
33-33 33
34-34 34
35-35 35
36-36 36
37-37 37
38-38 38
39-39 39
40-40 40
41-41 41
42-42 42
43-43 43
44-44 44
45-45 45
46-46 46
47-47 47
48-48 48
49-49 49
50-50 50
51-51 51
52-52 52
53-53 53
54-54 54
55-55 55
56-56 56
57-57 57
58-58 58
59-59 59
60-60 60
61-61 61
62-62 62
63-63 63
64-64 balance_performance
65-65 65
66-66 66
67-67 67
68-68 68
69-69 69
70-70 70
71-71 71
72-72 72
73-73 73
74-74 74
75-75 75
76-76 76
77-77 77
78-78 78
79-79 79
80-80 80
81-81 81
82-82 82
83-83 83
84-84 84
85-85 85
86-86 86
87-87 87
88-88 88
89-89 89
90-90 90
91-91 91
92-92 92
93-93 93
94-94 94
95-95 95
96-96 96
97-97 97
98-98 98
99-99 99
100-100 100
101-101 101
102-102 102
103-103 103
104-104 104
105-105 105
106-106 106
107-107 107
108-108 108
109-109 109
110-110 110
111-111 111
112-112 112
113-113 113
114-114 114
115-115 115
116-116 116
117-117 117
118-118 118
119-119 119
120-120 120
121-121 121
122-122 122
123-123 123
124-124 124
125-125 125
126-126 126
127-127 127
128-128 128
129-129 129
130-130 130
131-131 131
132-132 132
133-133 133
134-134 134
135-135 135
136-136 136
137-137 137
138-138 138
139-139 139
140-140 140
141-141 141
142-142 142
143-143 143
144-144 144
145-145 145
146-146 146
147-147 147
148-148 148
149-149 149
150-150 150
151-151 151
152-152 152
153-153 153
154-154 154
155-155 155
156-156 156
157-157 157
158-158 158
159-159 159
160-160 160
161-161 161
162-162 162
163-163 163
164-164 164
165-165 165
166-166 166
167-167 167
168-168 168
169-169 169
170-170 170
171-171 171
172-172 172
173-173 173
174-174 174
175-175 175
176-176 176
177-177 177
178-178 178
179-179 balance_power
180-180 180
181-181 181
182-182 182
183-183 183
184-184 184
185-185 185
186-186 186
187-187 187
188-188 188
189-189 189
190-190 190
191-191 191
192-192 192
193-193 193
194-194 194
195-195 195
196-196 196
197-197 197
198-198 198
199-199 199
200-200 200
201-201 201
202-202 202
203-203 203
204-204 204
205-205 205
206-206 206
207-207 207
208-208 208
209-209 209
210-210 210
211-211 211
212-212 212
213-213 213
214-214 214
215-215 215
216-216 216
217-217 217
218-218 218
219-219 219
220-220 220
221-221 221
222-222 222
223-223 223
224-224 224
225-225 225
226-226 226
227-227 227
228-228 228
229-229 229
230-230 230
231-231 231
232-232 232
233-233 233
234-234 234
235-235 235
236-236 236
237-237 237
238-238 238
239-239 239
240-240 240
241-241 241
242-242 242
243-243 243
244-244 244
245-245 245
246-246 246
247-247 247
248-248 248
249-249 249
250-250 250
251-251 251
252-252 252
253-253 253
254-254 254
=== Grenzen ===
Ab Wert 0: default
Ab Wert 16: performance
Ab Wert 64: balance_performance
Ab Wert 179: balance_power
Ab Wert 255: power
Was können
wir aus der Ausführung des Skript lernen um u.a. LPMD korrekte! EPP-Werte mitzugeben?
| |
0 | default |
16 | performance |
64 | balance_performance |
179 | balance_power |
255 | power |
Was müssen wir also tun? Ja Configs anpassen wie immer..
| | | |
WLT_IDLE | 255 | power | Komplett idle → max. sparen |
WLT_BATTERY_LIFE | 179 | power | Leichte Last → trotzdem max. sparen |
WLT_SUSTAINED | 179 | balance_power | Dauerlast → sparsam aber reaktiv |
WLT_BURSTY | 16 oder 64 | performance | Kurze Lastspitzen → volle Power bzw. viel Power erlaubt, springt mir zu schnell mal mit Hysterese-Werten experimentieren aktuell auch auf 179. |
Was könnte das Ziel sein? Lastabhängige EPP Regelung ohne selber an Reglern drehen zu müssen für ein reaktives aber auch energiesparsames System.
Also m.E. ist da durchaus Potential. Nach aktueller Berichterstattung will Intel das ja in den Kernel bekommen spätestens dann wirds "scharf". Sie habens immerhin schon ins Review auf die Kernel Mailinglist geschossen:
https://lore.kernel.org/platform-driver-x86/cover.1778560215.git.m.wieczorretman@pm.me/
@linrunner
ist diese Meldung im Journal aktuell gewollt?
[42924.184647] tlp: vm.laptop_mode is deprecated. Ignoring setting.
System:
- TLP 1.10.1- Kubuntu 26.04- Kernel: Linux thickpad 7.0.0-15-generic x86_64
ich hab mal folgende Werte gesetzt da ich diese damit in Verbindung bringe, macht aber keine Änderung an der o.g. Meldung:
Code:
anton@thickpad:~$ cat /etc/tlp.d/20-laptop-mode.conf
DISK_IDLE_SECS_ON_AC=0
DISK_IDLE_SECS_ON_BAT=0
MAX_LOST_WORK_SECS_ON_AC=0
MAX_LOST_WORK_SECS_ON_BAT=0