CPU Energieverbrauch

Kamikaze

Warrior of Sunlight
Teammitglied
Motivation
Ich habe vor ca. einem halben Jahr mit selbst gestrickten Algorithmen zur Anpassung der CPU Geschwindigkeit experimentiert. Das habe ich später aufgehört, aber die primitive Herangehensweise bei estctrl/powerd wurmt mich noch immer.

Deshalb habe ich beschlossen, meine Experimente in einen Daemon fließen zu lassen, der dann hoffentlich irgendwann in den Ports landet.

Die Messung
Zwischen estctrl/est und powerd/cpufreq gibt es einen besonders markanten Unterschied.

est hat an meinem Pentium-M 1300 die folgenden Geschwindigkeiten angeboten:
1300 1200 1000 800 600
Die findet man bei cpufreq unter dev.acpi_perf.0.freq_settings (für die erste CPU) wieder.

powerd verwendet die Geschwindigkeiten:
1300 1200 1050 1000 875 800 700 600 525 450 375 300 225 150 75
Diese findet man unter dev.cpu.0.freq_levels (wieder für die 1. CPU). Wie man sieht also viel feinere Abstufungen, die soweit ich das nachvollziehen kann durch idle calls an die cpu erreicht werden.

Um die effiziens dieser Methode zu prüfen habe ich den Energieverbrauch des Rechners (unter gleichbleibend geringer Belastung) für eine Weile mit 600MHz und 75Mhz gemessen. Also genau der geringsten richtigen Taktung und dem langsamsten Takt der möglich ist wenn die idle calls hinzukommen. Der Unterschied hat sich bei unter 100mW eingependelt. Das kann man fast schon in den Bereich der Messfehler verbannen.

Die erste Konsequenz für mich ist natürlich sysctl debug.cpufreq.lowest auf 600 zu setzen (sysctl.conf).

Ich brauche mehr!
Jetzt habe ich eine Bitte. Ich hätte gerne äquivalente Messungen mit anderen CPUs (Intel SpeedStep, AMD PowerNow!). Bei meinem Daemon werde ich einen switch dafür welche Liste man benutzt anbieten, aber von weiteren Messungen die ich mangels solcher CPUs nicht selbst durchführen kann hängen die Standardeinstellungen und natürlich Empfehlung in der man page ab.

Hilfe
Jetzt gibt es noch etwas wobei ich hilfe benötige, bisher verwende ich kern.cp_time um die Systemlast zu ermitteln, ich würde das aber gerne für jede CPU einzeln tun. Kennt jemand eine Möglichkeit?

Features
Für alle die es Interessiert, hier sind die geplanten Features meines Daemons.

Statt eine Lastgrenze zum Anheben des CPU-Takts und eine zum Absenken zu verwenden bekommt mein Daemon nur eine Lastgrenze zum Anheben. Gesenkt wird der Takt dann wenn es nicht wieder zu einem sofortigen anheben führt.

Der Daemon wird einen smooth Modus unterstützen der kurze Lastschwankungen ignoriert. Auf diese Weise kann man verhinden, das die CPU Geschwindigkeit angehoben wird nur weil z.B. gerade ein neues Fenster geöffnet wird.

Der Daemon wird nicht stupdide alle Taktungen durchgehen sondern kann auch direkt zum niedrigsten Takt springen der nicht zu einer direkten Takterhöhung führt.

Und natürlich kann man alle diese Einstellungen für Batteriebtrieb und Netzbetrieb seperat machen. Man ist also nicht gezwungen im adaptive Modus am Netz die gleiche Lastgrenze wie bei Batteriebetrieb zu verwenden.
 
Schau dir mal dieses Programm an: http://www.pbus-167.com/chc.htm
Da kann man sogar die Kern-Spannung der CPU verringern, damit sie weniger Strom braucht. Ich benutze es und es funktioniert sau-gut: Bringt mir ca. 20% mehr Akku-Laufzeit!
Wenn du sowas unter FreeBSD hinkriegen wuerdest, haettest du meinen Respekt sicher!!
 
Hallo,

das kann ich leider bestätigen. Bei mir bewirkt powerd leider überhaupt nichts.

Ich habe ein HP Omnibook 6000 (PIII 850MHz) bei dem Throttling funktioniert.

Mit powerd kann man auch wunderbar bis auf 105 MHz runter. Aber laut meinem Stromverbrauchsmesser (keine Ahnung wie das sonst heißt :) ) ändert sich nichts.

Booten: 25-45 Watt
Konsole: 25 Watt
Desktop: 27 Watt
mit Powerd bei 105 MHz (und ca. 5min. gewartet): 25 Watt

Kernel und Module müssten auch passen - da ja powerd die Taktrate ändern kann.

Aber den Sinn von powerd verstehe ich dann nicht.

Gruß
Basti_litho
 
Ich war auch skeptisch, am Anfang. Die Messung der Akku-Restzeit ist keine einfache Sache und von den Herstellern kommen da nur Schumeleien ans Licht, wenn man sich damit beschäftigt.

Mein Thinkpad R40, z.B, tut von 100% an so, als ob es nur 3 Stunden laufen könnte. Ohne powerd hat das Notebook, es insgesamt auf 3 Stunden und 28 Minuten gebracht. Die Schätzung der "letzen 5 Minuten", wo die orangene Akku-LED hektisch am Notebook blinkt, ist total falsch! Diese 5 Minuten (Akkuanzeige ist da etwa auf 2%) haben insgesamt ca 20 Minuten gedauert. Was hält man davon?

Bis zur Anzeige von ca 15% kann man überhaupt nichts mit der Schätzung anfangen. Da ist ein simpler Algo, der nach der Betriebszeit rechnet. Ab da ist aber auch alles völlig irrsinnig.

Mit powerd hat mein Notebook es auf mehr als 4 Stunden gebracht! Also 15% mehr Laufzeit. Ich kann Euch nicht sagen wie lange die Anzeige auf 0% Ladung und 0 Minuten Laufzeit gestanden hat. Es waren bestimmt mehr als 20 Minuten.

Also Vorsicht bei Messungen. Man kann sich da selbst vertun.
 
also ich konnte noch etwas feststellen:

nach dem laden des Moduls "cpufreq" und starten des powerd (mit -a min -b min) war zwar laut powerd (und dev.cpu.0.freq) der Takt bei 87 MHz aber laut
"hw.clockstat" sind es immer noch 850 MHz. Obwohl das System extrem viel langsamer war.

Stromverbrauch war aber laut "Wattmeter" (weiß leider immer noch nicht wie er heißt) immer noch bei 25 Watt.

Gruß

Basti_litho
 
Vielleicht schaltet Dein Notebook keine Frequenzen, wenn es an der Steckdose hängt? Keine Ahnung ob es irgendein Notebook tut.
 
nakal:

hab ich mir auch schon gedacht - hab dann im BIOS alles auf Automatik gestellt. Was aber leider auch nichts gebracht hat.



Vincent Vega:

wie gesagt, mit einem Wattmeter (weiss leider nicht wie es genau heisst) - so ein Stromverbrauchmessgeraet.
 
Basti_litho schrieb:
wie gesagt, mit einem Wattmeter (weiss leider nicht wie es genau heisst) - so ein Stromverbrauchmessgeraet.

Das war dann zwischen Notebook und Steckdose geschaltet?

Damit solltest du den Verbrauch des Gerätes sehen können. Plus eventuell den Verbrauch zum Laden des Akkus.

Vermutlich aber schaltet dein Notebook nicht herunter, wenn es am Netz hängt. Wozu auch, Leistung ist ja vorhanden.

Trennen die modernen Notebooks eigentlich den Akku vom Stromnetz, wenn der wieder voll ist? Die Lithium-Ionen Akkus haben ja leider nur eine gewisse Anzahl von Ladezyklen, die im Netzbetrieb sonst ja schneller mal weg sein könnten.
 
hi,

genau - so ein Wattmeter (zwischen Notebook und Steckdose).

Akku wird nicht wirklich mitgemessen - ist kaputt.

Beim BIOS im Noteook kann ich entscheiden ob die Stromsparfunktionen aktiviert werden sollen oder nicht (beim Anschluss an die Steckdose).

Das habe ich auch aktiviert. Leider trotzdem ohne Funktion, bzw. Effekt.

Obwohl ich sagen muss: 25 Watt beim ruhenden Desktop finde ich eigentlich ganz ok. Mich hat nur gewundert das der Stromverbrauch trotz 100 MHz Takt, nicht runtergegangen ist - obwohl der Rechner saulahm war. :)
 
So, ich geb ja nicht auf :D

Also, was ich seltsam finde, ist dass bei den möglichen Freq Level die Milliwatt angabe (man 4 cpufreq) bei allen auf "-1" steht. Ist das ein fehler?:
Code:
dev.cpu.0.freq_levels: 847/-1 741/-1 698/-1 610/-1 523/-1 436/-1 349/-1 261/-1 174/-1 87/-1

Hier mal eine Ausgabe eines anderen Users (irgendwo im Inernet):
Code:
dev.cpu.0.freq_levels: 1600/27000 1400/23625 1333/22000 1166/19250 
> 1067/18000 933/15750 800/13000 700/11375 600/9750 500/8125 400/6500 
> 300/4875 200/3250 100/1625

und "dmidecode" gibt mir auch einen "Current Speed" von 850 MHz (nachdem ich es per sysctl auf 100MHz runtergeschraubt habe:
Code:
Version: Pentium(R) III
                Voltage: 2.9 V
                External Clock: Unknown
                Max Speed: 850 MHz
                Current Speed: 850 MHz

Die Temperatur der CPU ändert sich leider auch nicht (wie gehabt) - ich frage mich wirklich ob es mit der "-1" zusammenhängt. Verändert er trotzdem die Milliwatt?
 
Basti_litho schrieb:
So, ich geb ja nicht auf :D

Also, was ich seltsam finde, ist dass bei den möglichen Freq Level die Milliwatt angabe (man 4 cpufreq) bei allen auf "-1" steht. Ist das ein fehler?:
Code:
dev.cpu.0.freq_levels: 847/-1 741/-1 698/-1 610/-1 523/-1 436/-1 349/-1 261/-1 174/-1 87/-1

Nein, kein Fehler. Nicht alle Geräte geben die Leistungsaufnahme an.

Basti_litho schrieb:
Hier mal eine Ausgabe eines anderen Users (irgendwo im Inernet):
Code:
dev.cpu.0.freq_levels: 1600/27000 1400/23625 1333/22000 1166/19250 
> 1067/18000 933/15750 800/13000 700/11375 600/9750 500/8125 400/6500 
> 300/4875 200/3250 100/1625

und "dmidecode" gibt mir auch einen "Current Speed" von 850 MHz (nachdem ich es per sysctl auf 100MHz runtergeschraubt habe:
Code:
Version: Pentium(R) III
                Voltage: 2.9 V
                External Clock: Unknown
                Max Speed: 850 MHz
                Current Speed: 850 MHz

Die Temperatur der CPU ändert sich leider auch nicht (wie gehabt) - ich frage mich wirklich ob es mit der "-1" zusammenhängt. Verändert er trotzdem die Milliwatt?

http://www.bsdforen.de/showpost.php?p=104565&postcount=12

Vermutlich kommen die 100MHz, die Du eingestellt hast, durch einen relativen Treiber zustande. Wie schon im verlinkten Beitrag erwähnt, halte ich nichts von relativen Treibern; der Energieverbrauch scheint dadurch nicht wirklich zu sinken.
 
Moin Konfuzius,

die meisten Notebooks schalten bei Netzbetrieb auf 100% CPU-Leistung, weil ja genug Energie zur Verfügung steht.

Der voll geladene Akku wird niemals vom Netz getrennt, sondern die Ladeelektronik schaltet auf "Erhaltungsladung" um. Es wird also immer der Ladezustand des Akkus geprüft. Sobald ein Kapazitätswert unterschritten ist, wird nach einer gewissen Hysterese ein Ladezyklus mit ca. 5% der Akkukapazität gestartet.
Da Lithium-Ionen-Akkus nur eine begrenzte Anzahl von Ladezyklen abkönnen, ist es wichtig, den Akku bei Dauernetzbetrieb aus dem Notebook zu nehmen.

Viele Grüße

Jürgen
 
Zurück
Oben