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.
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.
) ändert sich nichts.