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.