5 Punkte von GN⁺ 2025-12-29 | Noch keine Kommentare. | Auf WhatsApp teilen
  • 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.

Noch keine Kommentare.