Entwicklung einer macOS-App, die anzeigt, ob ein Mac wegen Hitze in den Thermal Throttling-Zustand gerät
(stanislas.blog)- MacThrottle ist eine SwiftUI-basierte App, die in der Menüleiste visuell anzeigt, wenn ein Mac seine Leistung aufgrund von Überhitzung begrenzt – Open Source
- Verglichen werden die
ProcessInfo.thermalState-API von macOS und der Befehlpowermetrics, um Wege zur präzisen Erkennung des tatsächlichen thermischen Zustands des Systems zu finden - Letztlich wurde eine Methode implementiert, die Benachrichtigungen nutzt, die
thermaldimnotifyd-System von Darwin veröffentlicht, um den thermischen Zustand ohne Root-Rechte auszulesen - Die App umfasst Temperatur- und Lüfterdrehzahl-Diagramme, farbige Symbole je nach Status sowie macOS-Benachrichtigungen und unterstützt auch den automatischen Start beim Login
- Als Werkzeug, mit dem sich der Wärmemanagement-Status von Apple-Silicon-Macs in Echtzeit erfassen lässt, bietet sie Entwicklern und Power-Usern ein nützliches Diagnosemittel
Wahrnehmung des Thermal-Throttling-Problems auf dem Mac
- Auf einem M2 MacBook Air traten bei Verwendung eines externen 4K-120Hz-Displays Leistungseinbrüche und Reaktionsverzögerungen auf
- Da kein Lüfter vorhanden ist, lässt sich kein Geräusch wahrnehmen, aber bei 100 % CPU-Auslastung sank der Stromverbrauch
- Mit iStat Menus und MX Power Gadget wurde Thermal Throttling diagnostiziert, indem Abfälle bei CPU-Frequenz und Leistungsaufnahme bestätigt wurden
- Dasselbe Phänomen trat auch auf einem M4 Max MacBook Pro auf und wird auf Grenzen des thermischen Designs des 14-Zoll-Modells zurückgeführt
- Die Energieeffizienz von Apple Silicon ist weiterhin hoch, dennoch bestand der Wunsch, eine direkte Methode zur Erkennung des thermischen Zustands zu finden
Thermischen Zustand unter macOS programmatisch prüfen
- macOS legt den thermischen Zustand auf mehrere Arten offen, allerdings nicht konsistent
- Die von Apple empfohlene Methode ist die Nutzung von
ProcessInfo.thermalStateausFoundation- Beispielausgaben:
nominal,fair,serious,critical
- Beispielausgaben:
- Auch der Befehl
powermetrics -s thermal, der Root-Rechte erfordert, liefert dieselben Informationen,
allerdings sind die Abstufungen der Zustände unterschiedlich- Beispiel:
fairumfasst sowohlmoderateals auchheavyauspowermetrics
- Beispiel:
- Der tatsächliche Zeitpunkt des Throttlings wird in
powermetricsalsheavyangezeigt, lässt sich inProcessInfojedoch nicht unterscheiden
Nutzung von thermald und dem Darwin-Benachrichtigungssystem
- Die Daten von
powermetricsstammen vomthermald-Daemon,
undthermaldveröffentlicht den aktuellen Thermal-Pressure-Status alsnotifyd-Systemereignis - Der Status lässt sich mit dem Befehl
notifyutil -g com.apple.system.thermalpressurelevelprüfen - In
OSThermalNotification.hdefinierte Thermal-Pressure-Stufen:nominal,moderate,heavy,trapping,sleeping
- Durch Aufrufe von
notify_register_checkundnotify_get_statein Swift wurde eine Funktion implementiert, mit der sich der thermische Zustand in Echtzeit ohne Root-Rechte auslesen lässt
Entwicklung der App MacThrottle
- Mit SwiftUI und MenuBarExtra wurde eine reine Menüleisten-App erstellt
- Der Status wird über die Farbe eines Thermometer-Symbols angezeigt (Grün → Rot)
- Durch Setzen von
LSUIElementauftrueinInfo.plistwird das Dock-Symbol deaktiviert
Erster Ansatz: Root-Helper mit powermetrics
- Anfänglich wurde zur Nutzung von
powermetrics, das Root-Rechte benötigt,
ein Helper-Prozess mit LaunchDaemon und Bash-Skript aufgebaut/usr/local/bin/mac-throttle-thermal-monitorschreibt alle 10 Sekunden den Status in eine Datei unter/tmp- Die App liest diese Datei regelmäßig aus und zeigt den Status an
Verbesserung: IPC-Benachrichtigungen von thermald verwenden
- Später wurde auf ein direktes Abonnieren der
notifyd-Ereignisse umgestellt- Keine Root-Rechte erforderlich, vereinfachter Code
Anzeige von Temperatur und Lüfterdrehzahl
- CPU-/GPU-Temperatur und Lüfterdrehzahl werden als Diagramme angezeigt
- Anfangs wurde bei Verwendung privater IOKit-APIs eine zu niedrige Temperatur angezeigt (~80 °C)
- Unter Bezug auf das Open-Source-Projekt Stats erfolgte der Wechsel zur SMC-Schnittstelle
- Je nach SoC-Generation müssen unterschiedliche Schlüssel (
Tp0D,Tf0Eusw.) verwendet werden
- Je nach SoC-Generation müssen unterschiedliche Schlüssel (
- Falls SMC nicht funktioniert, wird auf IOKit zurückgegriffen
Umsetzung des Menüleisten-Diagramms
- Das Diagramm zeigt gleichzeitig drei Informationen an
- Hintergrundfarbe: thermischer Zustand (Grün bis Rot)
- Durchgezogene Linie: CPU-Temperatur
- Gepunktete Linie: Verhältnis der Lüfterdrehzahl
- Die Daten werden alle 2 Sekunden erfasst, bei einer Historie über 10 Minuten
- Mit
onContinuousHoverwird ein Tooltip bereitgestellt,
und durch Hinzufügen von.drawingGrouperfolgt GPU-Rendering für eine flüssige Anzeige auch auf 120Hz-Displays
macOS-Benachrichtigungen und automatischer Start
- Es wurde eine Benachrichtigungsfunktion bei Änderungen des thermischen Zustands hinzugefügt
- Benachrichtigungen sind bei bestimmten Zustandswechseln oder bei Erholung möglich
- Über die
SMAppService-API wird die Konfiguration des automatischen Starts beim Login unterstützt- Steuerung über die Methoden
register()/unregister()/status
- Steuerung über die Methoden
Verteilung und Nutzung
- Da kein Apple-Developer-Konto vorhanden ist, ist eine offizielle Notarisierung nicht möglich
- Bei Installation über GitHub Releases ist in
Privacy and Securityeine manuelle Freigabe erforderlich - Auf manchen Macs ist eine Ausführung nur möglich, wenn direkt mit Xcode gebaut wird
- Bei Installation über GitHub Releases ist in
- Installations- und Build-Anleitung sind im GitHub-README beschrieben
Fazit
- MacThrottle ist ein leichtgewichtiges Tool, mit dem sich der Thermal-Throttling-Zustand von Apple-Silicon-Macs in Echtzeit überwachen lässt
- Es funktioniert ohne Root-Rechte und bietet Entwicklern wie Nutzern leistungsintensiver Workloads durch visuelles Feedback, Benachrichtigungen und Diagramme ein besseres Bewusstsein für den thermischen Zustand des Systems
1 Kommentare
Hacker-News-Kommentare
Ich hatte ein MacBook Pro i9 von 2019, und die Funktion zur Erkennung von Thermal Throttling könnte wohl so simpel sein
War natürlich ein Witz, aber es war ziemlich enttäuschend, einen teuren i9-CPU zu kaufen und dann weniger Leistung als bei einem i7 zu bekommen
Ich weiß nicht warum, aber so verschwand das Throttling
Trotzdem bleibe ich dabei, weil ich an den Workflow mit macOS und Logic gewöhnt bin
Ich könnte zwar zu Linux wechseln, aber im Moment ist es immer noch eine ziemlich brauchbare Maschine
Immer wenn ich zwei externe Monitore und Adobe Creative Suite genutzt habe, war das Throttling heftig, aber diese Pads haben es gelöst
Der Nachteil ist, dass die Unterseite heiß wird und man es kaum auf den Schoß nehmen kann, aber ich bereue es überhaupt nicht
Inzwischen bin ich auf ein M3 MacBook Air (24GB RAM) umgestiegen und sehr zufrieden
Wer noch das 2019er Modell nutzt, sollte den VRM-Wärmeleitpad-Umbau wirklich in Betracht ziehen
Auch bei Dell wurde es deutlich besser, sobald man vom i9 auf den i7 gewechselt ist
Im Grunde bin ich auf das Marketing mit „größere Zahl = besserer CPU“ hereingefallen
Als ich später auf einen M1 Max gewechselt bin, war es eine völlig andere Welt
Inzwischen habe ich auf einen M3 Max upgegradet, und Apple Silicon scheint wirklich lange durchzuhalten
Direkt nach dem Booten liefen die Lüfter an, und beim Anschließen von Thunderbolt-Geräten gab es oft Kernel Panics
Das M1 Max MBP, das ich jetzt nutze, ist absolut stabil
Das Projekt sieht ziemlich gut aus
Allerdings wird die Entwicklung unter macOS immer schwieriger, und selbst wenn man Throttling erkennt, ist fraglich, was man tatsächlich dagegen tun kann
Man kann die Lüftergeschwindigkeit doch nicht anpassen und Undervolting geht auch nicht, oder?
Die Standardkurve war so träge, dass das Throttling zuerst einsetzte
Auf Apple Silicon drehen die Lüfter mit High Power Mode schneller
Inzwischen nutze ich keine benutzerdefinierte Kurve mehr, aber beim 14" M4 Max ist es ziemlich laut
Das MacBook Air hat keinen Lüfter, da hilft nur noch Kühlen
Mit den Standardeinstellungen ging es über 90 Grad, deshalb habe ich es konservativer eingestellt
GitHub-Link
Manchmal dreht ein Prozess durch und verursacht Throttling, und bis ich das bemerke, ist der Akku schon halb leer
Das passiert oft, wenn viele Apps im Hintergrund laufen
Wenn man es in Homebrew aufnimmt, kann man kostenlose Code-Signierung und Notarisierung bekommen
Es wäre wirklich schön, wenn es so verteilt würde
Meine Hypothese ist, dass nicht die CPU das Problem ist, sondern der USB-Controller das Gerät thermisch sättigt
Nicht CPU/GPU, sondern das Gehäuse selbst überhitzt, wodurch die Wärmeabgabe blockiert wird und am Ende Throttling entsteht
Man müsste das mit anderen Adaptern oder Monitoren testen
Klingt also so, als hättest du recht
Wenn ich es an einen 4K-144Hz-Monitor anschließe und Zoom oder mehrere Videostreams laufen lasse, wird es sehr heiß
Ich glaube aber eher, dass das einfach an der hohen Last liegt als am USB-Controller
Die Website scheint wegen eines Traffic-Ansturms ausgefallen zu sein
Das Repository ist angristan/MacThrottle
Wenn in iStat Menus die CPU bei 100 % liegt, aber der Stromverbrauch niedrig ist, kann man an Throttling denken,
aber dasselbe passiert auch, wenn man an ein USB-C-Ladegerät mit geringer Leistung angeschlossen ist
Es wäre gut, eine Funktion zum Erkennen der Ladegeräteleistung hinzuzufügen
Während des Ladens wurde es heißer und das Throttling war deutlich stärker, aber wenn ich vorher aufgeladen habe, war das Problem weg
Seitdem verstehe ich, warum spätere Generationen mit stärkeren Netzteilen ausgeliefert wurden
Ist die Temperatur nicht direkt die Regelgröße?
Wenn man CPU-Auslastung und Systemleistung in der Menüleiste anzeigen lässt, kann man Anomalien sofort erkennen
exelban/stats
Ich habe gesehen, dass die CPU-Auslastung hoch war, während die Leistungsaufnahme sank
Im nächsten MacBook Air M5 hätte ich gern Vapor-Chamber-Kühlung
Im Moment scheint Apple minimale Lautstärke stärker zu priorisieren als Wärmeabfuhr
Deshalb erzwinge ich eine höhere Mindestdrehzahl des Lüfters
Sobald das Gehäuse mit der Umgebung im thermischen Gleichgewicht ist, stößt die Wärmeabgabe an ihre Grenze
Mit einem Lüfter lässt sich das mit Kupferplatte und Luftstrom eigentlich gut lösen
Am Ende ist es ein Problem der Energieerhaltung
Es scheint einen Bug bei Thermal-Pressure-Benachrichtigungen zu geben
Mich würde interessieren, ob du in der App so ein Problem hattest
Zugehöriges Issue
ProcessInfo.processInfo.thermalStatenicht aktualisiertAber bei der thermald-Benachrichtigungsmethode, die ich jetzt nutze, gibt es dieses Problem nicht
Ich frage mich, warum du mit
@_silgen_namedie Darwin-API direkt deklarierstIst sie über
import Darwinnicht zugänglich?import Darwinverfügbar gemacht