3 votes

Quelles sont les causes de l'utilisation excessive du processeur par les processus taskgated, notifyd et launchd ?

J'ai beaucoup cherché partout pour essayer de trouver la réponse à ceci mais jusqu'à présent, je n'ai pas réussi. Je programme en Python, et j'ai du code qui prend beaucoup de temps à s'exécuter (de quelques heures à plusieurs mois selon l'application) et j'essaie de l'optimiser. Sur des systèmes avec un grand nombre de threads (une fois que je dépasse les 8 threads, mais surtout >18 threads), je me retrouve dans une situation où le système utilise une grande quantité de mon CPU au lieu du code réel que je veux exécuter. Sur une machine avec 12 threads en ce moment, le système utilise 25 à 30% de mon CPU total. Si j'essaie de l'exécuter sur une machine avec 36 threads, le système prend >70% du CPU ce qui est tout simplement ingérable (mais le fait de lancer deux instances du code, en limitant chacune à 18 threads, réduit cette surcharge, curieusement).

Le Moniteur d'activité indique que taskgated utilise au moins 10%, tandis que notifyd, logd et launchd utilisent également plusieurs pourcents chacun (ainsi que mds à 1% donc je devrais désactiver Spotlight, et parfois lsd grimpe à plus de 40%, mais c'est plus rare ... notez que ce processus est un autre démon du système de lancement).

Mon ancienne hypothèse était que c'était un problème d'E/S de disque, étant donné que le code écrivait et lisait de nombreux petits fichiers pour essayer de garder une trace de certaines choses et de récupérer si j'avais besoin de l'arrêter.

Mon hypothèse actuelle, basée sur ce que j'ai pu trouver en ligne sur les interactions entre taskgated et launchd, est que ce morceau de code particulier génère un grand nombre de processus et que les démons de lancement et de sécurité de macOS consomment beaucoup de CPU pour s'assurer que ces processus sont sûrs. Il s'agit d'appels comme "mv" et "rm" depuis la ligne de commande (os.system(...) dans mon code Python), et de lancement d'autres codes qui prennent une à deux secondes pour s'exécuter (comme dans un environnement Conda différent lorsque deux ont des installations conflictuelles de composants nécessaires). Je compte au moins 40 endroits potentiels où ce morceau de code pourrait potentiellement générer des processus enfants, et je les multithreade de sorte qu'ils fassent cela simultanément sur autant de threads qu'il y en a (donc, sur une machine avec 12 threads, 12x40 sur une période d'environ ~10 secondes). Il ne me semble pas que cela devrait faire en sorte que mon système utilise autant de CPU, mais c'est ma meilleure supposition pour le moment.

Éventuellement lié, le taskgated imprime constamment des messages d'erreur dans les fichiers journaux, "Erreur MacOS : -67062", que j'ai encore cherché à diagnostiquer sans succès. Et, diskarbitrationd génère beaucoup de messages "" dans la Console, mais son pourcentage d'utilisation CPU est d'environ 0,3%, donc je suis moins inquiet à ce sujet.

Excusez-moi pour me perdre un peu dans mes explications, mais j'essaie de fournir les informations que j'ai, et j'espère que quelqu'un ici aura une idée. Si je peux me débarrasser de ce problème de 25% ou plus, cela pourrait économiser des mois de temps.

Pour ce que ça vaut, je tourne sous macOS 10.14.5 et ..4 sur deux ordinateurs de bureau, et 10.15.5 sur un ordinateur portable. Même problème pour tous. Le fait de l'exécuter sous Linux sur une configuration presque identique à 36 threads ne pose pas de problème de surcharge (mais je ne veux vraiment pas passer à Linux) ce qui est une autre raison pour laquelle je ne pense pas que ce soit un problème d'E/S de disque.

0voto

Graham Miln Points 39606

Votre question vise-t-elle à mieux comprendre macOS ou à rendre votre code Python plus rapide? Je soupçonne plutôt la deuxième option.

Dans ce cas, avez-vous profilé votre code Python? Que montre le profil de performance?

macOS

taskgated et launchd sont tous deux impliqués dans l'évaluation et le lancement de processus.

Activez le mode de performance serveur de macOS ici pour augmenter les limites des ressources.

Si vous soupçonnez un manque de signature de code, vous pouvez signer le code en ad-hoc le vôtre - et celui des autres :

sudo codesign -f -s - 

Processus externes

Les processus lancés varient en longévité, allant d'une simple commande "mv" dans le terminal à l'exécution d'un autre programme qui peut prendre des secondes à des heures, bien que la plupart soient du côté plus court.

Sur n'importe quel système d'exploitation, évitez d'appeler des processus externes s'il existe un appel dans le langage. Lancer un processus et attendre que le processus se termine est coûteux, comparé à un appel système.

Consultez Python - Comment déplacer un fichier? pour remplacer mv par os.rename(), shutil.move(), ou os.replace().

Threads

Ajouter des threads à votre processus ne garantira pas que les appels vers le système d'exploitation ne seront pas mis en attente et traités séquentiellement.

Les threads en Python sont les threads posix et sont donc gérés par le système d'exploitation. Ajouter des threads donne plus de travail au système d'exploitation sous-jacent et influence davantage la performance de votre processus. À cet égard, la différence entre Linux et macOS est significative.

Utilisez les threads pour la manipulation des données et, dans la mesure du possible, confiez le travail de gestion des fichiers à un thread dédié à la gestion des fichiers. Évitez de toucher au disque sauf si c'est absolument nécessaire pour continuer la tâche suivante. Même dans ce cas, essayez de transmettre des données vers et depuis d'autres processus en utilisant des tuyaux ou une communication inter-processus (IPC).

Utilisez des disques SSD (Solid State Drives) au lieu de disques durs rotatifs (HDD).

Linux

Étant donné que vous semblez avoir prouvé que Linux est plus rapide que macOS, utilisez Linux.

Docker

Pour gagner du temps, justifiez une expérimentation de 1 à 2 jours avec Docker. Cette approche vous permettra d'exécuter une instance légère de Linux sur votre Mac et d'éviter les coûts prouvés de macOS. Cela devrait faciliter l'économie des processus de lancement.

Il y aura une courbe d'apprentissage malheureuse avec Docker mais ce temps sera bien investi.

L'utilisation de Docker vous offrira un environnement de travail bien défini qui peut être démarré, arrêté et reproduit sans être lié au système d'exploitation hôte.

Inévitable?

Méfiez-vous de supposer que les 20-25% du temps du système ne sont pas utiles et sont évitables. macOS est un système d'exploitation lourd par rapport à Linux. La haute performance informatique utilise des systèmes d'exploitation spécifiques pour une raison. Si utiliser Linux est facile et permet d'obtenir les résultats plus rapidement, consacrer du temps à macOS semble injustifiable.

0voto

Dustin Martin Points 447

Je pense que le surcoût que vous obtenez avec les démons auxquels vous faites référence est inévitable sur macOS. Par exemple, launchd est le processus principal pour le lancement d'applications et veille à ce que les processus qu'il lance restent en vie s'ils sont instruits de le faire. Utiliser davantage de threads sur macOS est un problème bien connu concernant un surcoût plus élevé pour le noyau. C'est pourquoi la documentation d'Apple indique clairement que vous devez les utiliser de manière judicieuse et modérée. De plus, il semble que macOS ne fait pas confiance à votre script, étant donné qu'il s'agit d'un "exécutable" non signé et l'erreur que vous obtenez correspond à :

erreur de sécurité -67062 Erreur : 0xFFFEFA0A -67062 l'objet du code n'est pas du tout signé

Ainsi, le surcoût supplémentaire que vous constatez est très probablement dû à Gatekeeper, qui vérifie constamment ce que votre script génère et fait.

Solutions possibles (partielles) à votre problème :

  1. Intégrez votre script Python dans une application signée - c'est ce qu'Apple recommande dans la note technique TN2206.
  2. Utilisez Linux à la place

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X