- 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 Befehl powermetrics, um Wege zur präzisen Erkennung des tatsächlichen thermischen Zustands des Systems zu finden
- Letztlich wurde eine Methode implementiert, die Benachrichtigungen nutzt, die
thermald im notifyd-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.thermalState aus Foundation
- Beispielausgaben:
nominal, fair, serious, critical
- Auch der Befehl
powermetrics -s thermal, der Root-Rechte erfordert, liefert dieselben Informationen,
allerdings sind die Abstufungen der Zustände unterschiedlich
- Beispiel:
fair umfasst sowohl moderate als auch heavy aus powermetrics
- Der tatsächliche Zeitpunkt des Throttlings wird in
powermetrics als heavy angezeigt, lässt sich in ProcessInfo jedoch nicht unterscheiden
Nutzung von thermald und dem Darwin-Benachrichtigungssystem
- Die Daten von
powermetrics stammen vom thermald-Daemon,
und thermald veröffentlicht den aktuellen Thermal-Pressure-Status als notifyd-Systemereignis
- Der Status lässt sich mit dem Befehl
notifyutil -g com.apple.system.thermalpressurelevel prüfen
- In
OSThermalNotification.h definierte Thermal-Pressure-Stufen:
nominal, moderate, heavy, trapping, sleeping
- Durch Aufrufe von
notify_register_check und notify_get_state in 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
LSUIElement auf true in Info.plist wird 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-monitor schreibt 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, Tf0E usw.) verwendet werden
- 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
onContinuousHover wird ein Tooltip bereitgestellt,
und durch Hinzufügen von .drawingGroup erfolgt 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
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 Security eine manuelle Freigabe erforderlich
- Auf manchen Macs ist eine Ausführung nur möglich, wenn direkt mit Xcode gebaut wird
- 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
Noch keine Kommentare.