DispatchView expose le fonctionnement du multitâche sur Mac

Nicolas Furno |

Saviez-vous que les sauvegardes Time Machine de votre Mac ne débutaient pas précisément toutes les 60 minutes ? En théorie, la sauvegarde est mise à jour toutes les heures, mais dans les faits, elle est parfois en avance ou en retard de quelques minutes. Ce n’est pas un bug, c’est voulu : depuis macOS Sierra, la décision de lancer ou de retarder une sauvegarde dépend de Grand Central Dispatch (GCD).

La sauvegarde automatique de Time Machine se fait à peu près toutes les heures. Cliquer pour agrandir

Cette technologie est présente dans le système d’Apple depuis 2009 et Snow Leopard (et iOS 4 en 2010). GCD facilite la gestion des processeurs multi-core qui sont la norme depuis plus de dix ans pour les Mac. Avant son arrivée, les développeurs de chaque app devaient gérer tous les cœurs à disposition pour optimiser leurs logiciels. C’était une tâche difficile et très peu d’apps le faisaient et encore moins le faisaient correctement.

C’est pourquoi Apple a pris les choses en main avec GCD, une technologie qui met en parallèle les tâches au sein d’un programme et au sein du système d’exploitation. En fonction des besoins et des ressources disponibles, les tâches sont positionnées et programmées sur un cœur ou sur un autre. L’idée étant d’éviter les ralentissements en répartissant la charge sur tous les cœurs, notamment pour éviter le blocage complet de l’interface (la fameuse roue colorée de macOS).

Le principe de GCD est facile à saisir instinctivement. Néanmoins, Quand on essaie de comprendre comment il fonctionne concrètement, c’est une autre paire de manches. Le système est devenu extrêmement sophistiqué au fil des années et la prise de décision dépend d’un si grand nombre de critères que GCD apparaît comme une boîte noire pour la majorité des utilisateurs et même pour les développeurs. En particulier, la gestion de la priorité, pour savoir quelle tâche doit être exécutée en premier, est très difficile à comprendre.

L’icône de Grand Central Dispatch. Cliquer pour agrandir

macOS compte toujours plus sur ce système de gestion de tâches et c’est tout particulièrement le cas avec El Capitan et Sierra. Certains bugs de ces systèmes sont sans doute liés à GCD, puisqu’il prend en charge de plus en plus de fonctions du système. Les coupures de Bluetooth que l’on observe parfois avec Sierra sont peut-être associées à GCD plutôt qu’aux pilotes eux-mêmes.

Pour en revenir à Time Machine, un bug rare (le Mac ne devait pas entrer en veille pendant plusieurs jours de suite) corrigé avec macOS 10.12.4 pouvait bloquer complètement les sauvegardes automatiques. GCD est, au moins en partie, responsable : c’est lui qui lance une sauvegarde automatique, et non plus le processus historique launchd. Ce choix a permis à Apple d’optimiser encore davantage son système de sauvegarde et le choix d’initier ou de retarder une mise à jour dépend aussi de votre utilisation du Mac.

Une heure après la sauvegarde précédente, macOS essaie de deviner ce que vous faites avec votre ordinateur pour décider de lancer une nouvelle sauvegarde ou la retarder de quelques minutes. Cela passe par l’utilisation du processeur, naturellement, mais ce n’est pas le seul critère. GCD a été développé avec l’optimisation de l’autonomie en tête et le lancement de la sauvegarde dépend aussi d’autres choses certainement liés à l’état de la batterie sur les portables.

Cette sophistication permet d’améliorer les performances de macOS, mais elle complique au passage la recherche face à un bug. Pour essayer de mieux comprendre le fonctionnement de GCD, DispatchView est un utilitaire gratuit qui filtre l’historique de macOS (les logs) pour n’afficher que ce qui concerne GCD. Il affiche l’information sur deux colonnes : à gauche, la liste des messages envoyées par le Duet Activity Scheduler (DAS), le composant qui détermine la priorité de chaque tâche ; à droite, la liste Centralized Task Scheduling (CTS) qui exécute ou programme les tâches en fonction de cette priorité.

À gauche, l’analyse de GDC pour lancer ou retarder certaines tâches ; à droite, l’exécution des tâches en fonction de ce qui a été décidé. Ici, on voit la décision d’initier une sauvegarde Time Machine. Cliquer pour agrandir

L’interface est rudimentaire et les informations remontées par macOS ne sont pas toujours très lisibles. Mais en cas de problème lié à GCD, cet outil peut servir à déterminer la cause. Sur la capture d’écran, on voit à droite que la sauvegarde Time Machine a été initiée grâce à ce message :

2017-05-11 10:01:39.242046+0200  localhost UserEventAgent[52]: (com.apple.cts) [com.apple.xpc.activity.All] DAS told us to run com.apple.backupd-auto

On peut alors chercher dans la colonne de gauche la décision du DAS en retrouvant à peu près la même heure. Les messages ne sont pas explicites, mais vous verrez parfois des tâches qui sont suffisamment importantes et qui vont ainsi être exécutées par le CTS :

2017-05-11 10:01:39.240029+0200  localhost DuetHeuristic-BM[109]: (DuetActivitySchedulerDaemon) [com.apple.duetactivityscheduler.scoring] '<private>' CurrentScore: 0.931058, ThresholdScore: 0.780057 DecisionToRun:1

Et parfois, des tâches qui ne sont pas suffisamment importantes et qui ne sont pas exécutées. Ce qui revient à retarder la tâche en question et éventuellement la relancer quelques secondes ou minutes plus tard selon les cas. Voici à quoi cela ressemble :

2017-05-11 10:01:39.238408+0200  localhost DuetHeuristic-BM[109]: (DuetActivitySchedulerDaemon) [com.apple.duetactivityscheduler.scoring] <private>:[
<private> ] sumScores:29.020000, denominator:29.020000, FinalDecision: Must Not Proceed FinalScore: 0.000000}

Seuls les développeurs au sein d’Apple qui travaillent sur Grand Central Dispatch pourraient comprendre la logique du DAS et savoir pourquoi une tâche est importante ou non. Cet utilitaire ne vous aidera pas vraiment, mais il offre une plongée fascinante dans l’envers du décor pour les plus curieux.

Et si vous voulez aller plus loin encore, Apple propose de nombreuses sessions techniques sur GCD à cette adresse.

avatar fosterj | 

Ah ah vous avez perdu 4 min à lire cet article Et 15 sec de plus à lire mon commentaire ??

avatar Shaskan | 

@fosterj

Pas perdu de temps je trouvais l'article intéressant ?

avatar Yuku | 

@fosterj :
Au contraire, ça change des copier/coller/traductions de certains autres rédacteurs !
Continuez Nicolas, c'est vous qui faites la différence !

avatar LeGrosJeanLou | 

@Yuku

On ne peut plus d'accord avec ce commentaire !

avatar Oenc | 

@fosterj, MDR comme si ton commentaire prenais 15sec. pour se lire. Tu lis très lentement alors?

avatar Lightman | 

J'aime bien ces articles qui parlent de la mécanique de macOS ?

avatar mat 1696 | 

@Lightman

Moi aussi! C'est là qu'on se rend compte de la complexité pour corriger un bug qui nous semble tout bête...

avatar ShugNinx | 

Pas facile... Autant les logs du CTS sont compréhensibles, autant ceux du DAS sont illisible. On voit qu'il décide d'autoriser ou pas, mais pas du tout ce qui est concerné par la décision.

Super article en tout cas.

avatar françois bayrou | 

"GCD automatise la gestion des processeurs ... "

je dirais plutôt qu'il facilite la gestion des processeurs multi-coeurs. Ce n'est pas du tout automatique : c'est à la charge des développeurs de préciser les tâches qui peuvent être parallélisées, qui peuvent être mises dans une file d'attente, etc.

avatar byte_order | 

Toutafé, on est très loin d'une parallèlisation et distribution automatique des tâches.
Ce n'est pas non plus à propremment parler de la gestion des processeurs, ça c'est le boulot du scheduleur du noyau.

C'est un gestionnaire de listes de tâches parallèles.

avatar BeePotato | 

@ byte_order : « Toutafé, on est très loin d'une parallèlisation et distribution automatique des tâches. »

On va dire que je chipote, mais en fait j’éclaircis : on est bel et bien en présence d’un système de distribution (et donc parallélisation éventuelle) des tâches.
Ce qui n’est pas automatique, c’est la définition (la création) des tâches. Ce qui est dommage, mais pas choquant étant donné qu’on ne dispose pas (à l’heure actuelle — soyons optimistes :-) ) permettant de faire ça automatiquement et efficacement.

CONNEXION UTILISATEUR