Récit du développement d’une app macOS qui indique quand un Mac subit un ralentissement thermique
(stanislas.blog)- 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.thermalStatede macOS et la commandepowermetricsafin 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
thermalddans le systèmenotifydde 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.thermalStatedeFoundation- Exemple de sortie :
nominal,fair,serious,critical
- Exemple de sortie :
- 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,
faircouvre à la foismoderateetheavydanspowermetrics
- Par exemple,
- Au moment où le throttling réel se produit,
powermetricsafficheheavy, maisProcessInfone permet pas de le distinguer
Exploiter thermald et le système de notifications Darwin
- Les données de
powermetricsproviennent du démonthermald,
etthermaldpublie l’état actuel de pression thermique sous forme d’événements systèmenotifyd - 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_checketnotify_get_statedepuis 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)
LSUIElementest défini surtruedansInfo.plistpour 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.)
- Selon la génération du SoC, il faut utiliser des clés différentes (
- 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
onContinuousHoverfournit des info-bulles,
et l’ajout de.drawingGrouppermet 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
- Contrôle via les méthodes
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 Securityest nécessaire - Sur certains Mac, il faut compiler directement avec Xcode pour pouvoir lancer l’application
- Lors d’une installation depuis une release GitHub, une validation manuelle dans
- 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
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
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
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
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
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 »
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
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 ?
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
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
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
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
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
Je pense que tu as raison
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 dirait que le site est tombé à cause d’un pic de trafic
Le dépôt est angristan/MacThrottle
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
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
J’ai ensuite compris pourquoi les générations suivantes étaient livrées avec des adaptateurs plus puissants
N’est-ce pas justement la variable de contrôle ?
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
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
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
ProcessInfo.processInfo.thermalState: l’état ne se mettait pas à jourEn 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_nameN’est-elle pas accessible avec
import Darwin?import Darwin