5 points par GN⁺ 2025-12-29 | Aucun commentaire pour le moment. | 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

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.