5 points par GN⁺ 2025-12-29 | 1 commentaires | Partager sur WhatsApp
  • MacThrottle est une application basée sur SwiftUI qui indique visuellement dans la barre des menus quand un Mac limite ses performances à cause de la surchauffe — open source
  • L’auteur compare l’API ProcessInfo.thermalState de macOS et la commande powermetrics afin d’explorer comment détecter avec précision l’état thermique réel du système
  • Au final, il met en œuvre une méthode qui exploite les notifications publiées par thermald dans le système notifyd de Darwin pour lire l’état thermique sans privilèges root
  • L’application inclut des graphiques de température et de vitesse des ventilateurs, des icônes colorées selon l’état, ainsi que les notifications macOS, et prend aussi en charge le lancement automatique à la connexion
  • C’est un outil qui permet de suivre en temps réel l’état de gestion thermique des Mac Apple Silicon, offrant aux développeurs et aux power users un moyen de diagnostic utile

Reconnaître les problèmes de thermal throttling sur Mac

  • Sur un MacBook Air M2, l’utilisation d’un écran externe 4K 120 Hz entraîne une baisse de performances et des latences de réponse
    • Comme il n’y a pas de ventilateur, il est impossible de détecter du bruit, mais la consommation électrique diminue alors même que l’utilisation CPU reste à 100 %
  • L’auteur utilise iStat Menus et MX Power Gadget pour confirmer la baisse de fréquence CPU et de consommation électrique, et diagnostiquer un thermal throttling
  • Le même phénomène apparaît aussi sur un MacBook Pro M4 Max, présenté comme lié aux limites de conception thermique du modèle 14 pouces
  • L’efficacité énergétique d’Apple Silicon reste élevée, mais l’objectif est de trouver un moyen de détecter directement l’état thermique

Vérifier l’état thermique de manière programmatique sur macOS

  • macOS expose l’état thermique de plusieurs façons, mais sans grande cohérence
  • La méthode recommandée par Apple consiste à utiliser ProcessInfo.thermalState de Foundation
    • Exemple de sortie : nominal, fair, serious, critical
  • La commande powermetrics -s thermal, qui nécessite les privilèges root, fournit elle aussi cette information,
    mais les niveaux d’état ne correspondent pas exactement entre les deux approches
    • Par exemple, fair couvre à la fois moderate et heavy dans powermetrics
  • Au moment où le throttling réel se produit, powermetrics affiche heavy, mais ProcessInfo ne permet pas de le distinguer

Exploiter thermald et le système de notifications Darwin

  • Les données de powermetrics proviennent du démon thermald,
    et thermald publie l’état actuel de pression thermique sous forme d’événements système notifyd
  • Il est possible de consulter cet état avec la commande notifyutil -g com.apple.system.thermalpressurelevel
  • Niveaux de pression thermique définis dans l’en-tête OSThermalNotification.h :
    • nominal, moderate, heavy, trapping, sleeping
  • En appelant notify_register_check et notify_get_state depuis du code Swift, l’auteur implémente une lecture en temps réel de l’état thermique sans privilèges root

Développement de l’application MacThrottle

  • Création d’une application dédiée à la barre des menus avec SwiftUI et MenuBarExtra
    • L’état est affiché via la couleur d’une icône de thermomètre (vert → rouge)
    • LSUIElement est défini sur true dans Info.plist pour désactiver l’icône dans le Dock

Approche initiale : helper root avec powermetrics

  • Au départ, pour utiliser powermetrics, qui demande les privilèges root,
    un processus helper est mis en place avec un LaunchDaemon et un script bash
    • /usr/local/bin/mac-throttle-thermal-monitor écrit l’état toutes les 10 secondes dans un fichier de /tmp
    • L’application lit ensuite ce fichier périodiquement pour l’afficher

Amélioration : utilisation des notifications IPC de thermald

  • L’implémentation est ensuite remplacée par un abonnement direct aux événements notifyd
    • Plus besoin de privilèges root, et le code est simplifié

Affichage de la température et de la vitesse des ventilateurs

  • L’application affiche sous forme de graphique la température CPU/GPU et la vitesse des ventilateurs
  • Au départ, l’utilisation d’une API privée IOKit affichait des températures inférieures à la réalité (~80 °C)
  • En s’appuyant sur le projet open source Stats, l’auteur passe ensuite à l’interface SMC
    • Selon la génération du SoC, il faut utiliser des clés différentes (Tp0D, Tf0E, etc.)
  • Si SMC ne fonctionne pas, l’application retombe sur IOKit

Implémentation du graphique dans la barre des menus

  • Le graphique affiche simultanément 3 types d’information
    • Couleur de fond : état thermique (vert à rouge)
    • Ligne continue : température CPU
    • Ligne pointillée : ratio de vitesse des ventilateurs
  • Les données sont collectées toutes les 2 secondes, avec un historique glissant sur 10 minutes
  • onContinuousHover fournit des info-bulles,
    et l’ajout de .drawingGroup permet un rendu GPU fluide même sur un écran 120 Hz

Notifications macOS et lancement automatique

  • Une fonction d’envoi de notifications est ajoutée lors des changements d’état thermique
    • Des notifications peuvent être envoyées pour certaines transitions d’état ou lors d’un retour à la normale
  • La configuration du lancement automatique à la connexion repose sur l’API SMAppService
    • Contrôle via les méthodes register() / unregister() / status

Distribution et utilisation

  • Faute de compte Apple Developer, la notarisation officielle est impossible
    • Lors d’une installation depuis une release GitHub, une validation manuelle dans Privacy and Security est nécessaire
    • Sur certains Mac, il faut compiler directement avec Xcode pour pouvoir lancer l’application
  • Les méthodes d’installation et de build sont décrites dans le README GitHub

Conclusion

  • MacThrottle est un outil léger permettant de surveiller en temps réel l’état de thermal throttling des Mac Apple Silicon
  • Il fonctionne sans privilèges root et offre, grâce à son feedback visuel, ses notifications et ses graphiques,
    une meilleure visibilité sur l’état thermique du système pour les développeurs et les utilisateurs de charges intensives

1 commentaires

 
GN⁺ 2025-12-29
Avis sur Hacker News
  • J’utilisais un MacBook Pro i9 de 2019, et la fonction de détection du thermal throttling pourrait sans doute être aussi simple que ça

    function isThermalThrottling() {
      return true;
    }
    

    C’est une blague, mais c’était assez décevant d’acheter un CPU i9 hors de prix pour obtenir de moins bonnes performances qu’un i7

    • J’ai le même modèle, et je n’ai pu résoudre le problème qu’en chargeant via le port de droite
      Je ne sais pas pourquoi, mais le throttling disparaissait ainsi
      Cela dit, je continue à l’utiliser parce que je suis habitué à un workflow basé sur macOS et Logic
      Je pourrais passer à Linux, mais pour l’instant c’est une machine tout à fait correcte
    • J’avais aussi un modèle i9 de 2019, et le fait d’ajouter des pads thermiques sur le module VRM l’a transformé en un ordinateur totalement différent
      Le throttling était sévère dès que j’utilisais deux moniteurs externes et Adobe Creative Suite, mais ces pads ont réglé le problème
      L’inconvénient, c’est que le dessous chauffe davantage et qu’il devient difficile à garder sur les genoux, mais je ne le regrette pas du tout
      Je suis maintenant passé à un MacBook Air M3 (24GB RAM) et j’en suis très satisfait
      Si vous utilisez encore le modèle 2019, je recommande vraiment d’envisager la modification avec des pads thermiques sur le VRM
    • En réalité, je pense que l’i9 était lui-même un CPU inadapté aux ordinateurs portables
      Chez Dell aussi, le simple passage d’un i9 à un i7 a nettement amélioré la situation
      C’était en quelque sorte se faire piéger par le marketing du « gros chiffre = meilleur CPU »
    • J’ai eu le même problème, surtout avec deux moniteurs externes connectés
      Puis je suis passé au M1 Max et c’était un autre monde
      J’ai maintenant fait la mise à niveau vers un M3 Max, et Apple Silicon semble parti pour durer longtemps
    • Cet ordinateur portable a été le pire ordinateur que j’aie jamais utilisé
      Les ventilateurs se mettaient à tourner dès le démarrage, et des kernel panics survenaient souvent lors de la connexion d’appareils Thunderbolt
      Le MBP M1 Max que j’utilise maintenant est parfaitement stable
  • Le projet a l’air plutôt bien
    Cela dit, développer sur macOS devient de plus en plus difficile, et même si on détecte le throttling, on peut se demander ce qu’il est réellement possible de faire
    On ne peut pas régler la vitesse des ventilateurs, et l’undervolting n’est pas impossible ?

    • Dans mon cas, j’utilisais iStat Menus pour ajuster manuellement la courbe des ventilateurs
      La courbe par défaut était trop lente, donc le throttling se produisait d’abord
      Sur Apple Silicon, l’utilisation du High Power Mode fait tourner les ventilateurs plus vite
      Je n’utilise plus de courbe personnalisée maintenant, mais sur le 14" M4 Max c’est assez bruyant
      Le MacBook Air n’a pas de ventilateur, donc il ne reste qu’à le laisser refroidir
    • J’utilise Macs Fan Control pour régler le RPM des ventilateurs selon la température du CPU
      Avec le réglage par défaut, ça montait au-dessus de 90 degrés, donc j’ai configuré quelque chose de plus conservateur
      Lien GitHub
    • J’avais vraiment besoin d’une application comme celle-ci, et maintenant elle existe
      Il arrive qu’un processus s’emballe et provoque du throttling, et avant même que je m’en rende compte, la batterie est déjà à moitié vide
    • Au final, la seule chose à faire, c’est quitter l’application ou faire une pause un moment
      Ce genre de problème arrive souvent quand trop d’applications tournent en arrière-plan
  • Si c’est intégré à Homebrew, on peut obtenir gratuitement la signature de code et la notarisation
    Ce serait vraiment bien que la distribution se fasse ainsi

    • Bonne info. Je me demande s’il existe aussi une méthode gratuite de signature pour Windows
    • Oh, je ne le savais pas. Je pensais que cela dépendait des réglages du développeur, il va falloir que je regarde ça
  • Mon hypothèse, c’est que le problème ne vient pas du CPU mais du contrôleur USB qui sature thermiquement
    Ce n’est pas le CPU/GPU qui surchauffe, mais le châssis qui devient trop chaud, ce qui bloque la dissipation thermique et finit par provoquer le throttling
    Il faudrait faire des essais avec d’autres adaptateurs ou moniteurs

    • J’utilise aussi un i9 de 2019, et le simple fait de changer de port de charge a supprimé le throttling
      Je pense que tu as raison
    • Je n’ai pas tout compris en détail, mais mon M2 Air présente aussi des symptômes similaires
      Quand je le branche à un moniteur 4K 144Hz et que j’ouvre Zoom ou plusieurs flux vidéo, la chauffe devient importante
      Ce n’est peut-être pas le contrôleur USB, mais simplement la charge qui est élevée
    • On appelle ce phénomène thermal soaking
  • On dirait que le site est tombé à cause d’un pic de trafic
    Le dépôt est angristan/MacThrottle

    • C’est corrigé. Cloudflare Workers était configuré en mode fail closed, ce qui bloquait le trafic
  • Sur iStat Menus, si le CPU est à 100 % mais que la consommation électrique est faible, on peut penser à du throttling,
    mais le même phénomène se produit aussi lorsqu’on est branché à un chargeur USB-C de faible puissance
    Ce serait bien d’ajouter une fonction qui détecte la puissance du chargeur

    • J’ai eu le même problème avec un MacBook Air M1 pendant une session de D&D
      Comme il chauffait davantage en charge, le throttling devenait sévère, mais le fait de le recharger à l’avance avant la session a résolu le problème
    • Il m’est déjà arrivé qu’un adaptateur secteur insuffisamment puissant fasse se vider la batterie jusqu’à l’arrêt pendant que je jouais
      J’ai ensuite compris pourquoi les générations suivantes étaient livrées avec des adaptateurs plus puissants
    • Dans ce cas, je me demande pourquoi la seule température des cœurs ne suffit pas à déterminer s’il y a throttling
      N’est-ce pas justement la variable de contrôle ?
    • iStat Menus affiche bien la puissance du chargeur, mais on se demande toujours pourquoi ce phénomène se produit
  • Afficher l’utilisation CPU et la puissance système dans la barre de menus permet de repérer immédiatement les comportements anormaux
    exelban/stats

    • C’est aussi comme ça que j’ai commencé à soupçonner du throttling
      J’ai remarqué que l’utilisation CPU restait élevée alors que la puissance diminuait
  • J’aimerais que le prochain MacBook Air M5 adopte un refroidissement par chambre à vapeur
    En ce moment, on dirait qu’Apple privilégie davantage la réduction du bruit que la dissipation thermique
    C’est pourquoi je force une vitesse minimale plus élevée pour les ventilateurs

    • La chambre à vapeur est efficace pour la dissipation thermique instantanée, mais au bout du compte la chaleur est transmise au châssis en aluminium
      Une fois que le châssis atteint l’équilibre thermique avec l’environnement, la capacité de dissipation atteint sa limite
      S’il y a un ventilateur, une plaque de cuivre et un flux d’air suffisent largement à régler le problème
      Au fond, c’est une question de conservation de l’énergie
  • Il semble y avoir un bug de notification de thermal pressure
    Je me demande si vous avez rencontré ce problème dans l’application
    Issue liée

    • J’ai observé la même chose en utilisant ProcessInfo.processInfo.thermalState : l’état ne se mettait pas à jour
      En revanche, je n’ai pas ce problème avec la méthode actuelle de notification via thermald
  • Je me demande pourquoi vous avez déclaré directement l’API Darwin avec @_silgen_name
    N’est-elle pas accessible avec import Darwin ?

    • En réalité, il semble que cette API ne soit pas exposée avec le seul import Darwin