5 Punkte von GN⁺ 2025-12-29 | 1 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

1 Kommentare

 
GN⁺ 2025-12-29
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

    function isThermalThrottling() {
      return true;
    }
    

    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 nutze dasselbe Modell, und bei mir ließ sich das Problem nur lösen, wenn ich über den rechten Port geladen habe
      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
    • Ich hatte auch das i9-Modell von 2019, und nachdem ich Wärmeleitpads auf das VRM-Modul geklebt hatte, fühlte es sich wie ein komplett neuer Computer an
      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
    • Ich denke ehrlich gesagt, dass der i9 selbst eine für Laptops ungeeignete CPU war
      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
    • Ich hatte dasselbe Problem, besonders mit zwei externen Monitoren
      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
    • Dieser Laptop war der schlechteste Computer, den ich je benutzt habe
      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?

    • Ich habe in meinem Fall mit iStat Menus die Lüfterkurve selbst angepasst
      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
    • Ich nutze Macs Fan Control, um die Lüfter-RPM anhand der CPU-Temperatur zu regeln
      Mit den Standardeinstellungen ging es über 90 Grad, deshalb habe ich es konservativer eingestellt
      GitHub-Link
    • So eine App habe ich wirklich gebraucht, und jetzt gibt es sie endlich
      Manchmal dreht ein Prozess durch und verursacht Throttling, und bis ich das bemerke, ist der Akku schon halb leer
    • Am Ende kann man nur die App beenden oder kurz pausieren
      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

    • Gute Info. Ich frage mich, ob es auch eine kostenlose Methode zum Signieren für Windows gibt
    • Oh, das wusste ich nicht. Ich dachte, das hänge von den Entwickler-Einstellungen ab, aber ich sollte das mal nachsehen
  • 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

    • Ich nutze auch einen 2019er i9, und als ich den Ladeport gewechselt habe, verschwand das Throttling
      Klingt also so, als hättest du recht
    • Ich habe es nicht vollständig verstanden, aber mein M2 Air zeigt etwas Ähnliches
      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
    • Dieses Phänomen nennt man thermal soaking
  • Die Website scheint wegen eines Traffic-Ansturms ausgefallen zu sein
    Das Repository ist angristan/MacThrottle

    • Behoben. Cloudflare Workers war auf Fail-Closed gesetzt und hat deshalb den Traffic blockiert
  • 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

    • Ich hatte dasselbe Problem mit einem M1 MacBook Air, als ich eine D&D-Session gespielt habe
      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
    • Früher ist mir wegen zu geringer Leistung des Netzteils beim Spielen sogar der Akku leer geworden und das Gerät ging aus
      Seitdem verstehe ich, warum spätere Generationen mit stärkeren Netzteilen ausgeliefert wurden
    • Dann frage ich mich, warum man Throttling nicht allein anhand der Kerntemperatur erkennen kann
      Ist die Temperatur nicht direkt die Regelgröße?
    • iStat Menus zeigt zwar die Ladegeräteleistung an, aber warum dieses Verhalten auftritt, ist mir immer noch unklar
  • Wenn man CPU-Auslastung und Systemleistung in der Menüleiste anzeigen lässt, kann man Anomalien sofort erkennen
    exelban/stats

    • So habe ich auch zum ersten Mal Throttling vermutet
      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

    • Eine Vapor Chamber ist gut für kurzfristige Wärmeverteilung, aber am Ende wird die Wärme trotzdem an das Aluminiumgehäuse weitergegeben
      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

    • Ich habe auch gesehen, dass sich der Status bei ProcessInfo.processInfo.thermalState nicht aktualisiert
      Aber bei der thermald-Benachrichtigungsmethode, die ich jetzt nutze, gibt es dieses Problem nicht
  • Ich frage mich, warum du mit @_silgen_name die Darwin-API direkt deklarierst
    Ist sie über import Darwin nicht zugänglich?

    • Anscheinend wird diese API tatsächlich nicht allein über import Darwin verfügbar gemacht