He mirado por ahí un montón para tratar de encontrar la respuesta a esto, pero hasta ahora no he tenido éxito. Estoy programando en Python, y tengo un código que tarda mucho en ejecutarse (de horas a meses dependiendo de la aplicación) y estoy intentando optimizarlo. En sistemas de hilos más grandes (una vez que supero los 8 hilos, pero especialmente >18 hilos), me encuentro con una situación en la que el sistema está utilizando una gran cantidad de mi CPU en lugar del código real que quiero ejecutar. En una máquina de 12 hilos mientras escribo esto, el sistema está usando el 25-30% de mi CPU total. Si intento ejecutarlo en una máquina de 36 hilos, el sistema consume más del 70% de la CPU, lo que es simplemente inviable (aunque ejecutar dos instancias del código, limitando cada una a 18 hilos, reduce esta sobrecarga, curiosamente).
El monitor de actividad indica que taskgated
está utilizando al menos el 10%, mientras que notifyd
, logd
y launchd
también están utilizando varios por ciento, cada uno (junto con mds
al 1% por lo que debería apagar Spotlight, y a veces lsd
picos a >40%, pero eso es más raro ... tenga en cuenta que ese proceso es otro demonio del sistema de lanzamiento).
Mi hipótesis más antigua era que se trataba de un problema de E/S del disco, ya que el código escribía y leía muchos archivos pequeños para intentar llevar la cuenta de ciertas cosas y recuperarse si necesitaba detenerlo.
Mi hipótesis ahora en marcha, basada en lo que pude encontrar en internet sobre las interacciones entre taskgated
y launchd
El problema es que este trozo de código en particular está generando un gran número de procesos y los demonios de lanzamiento y seguridad de MacOS están consumiendo grandes cantidades de CPU para asegurarse de que esos procesos son seguros. Estas son cosas como llamar a "mv" y "rm" desde la línea de comandos (os.system(...) en mi código Python), y generar otro código que tarda uno o dos segundos en ejecutarse (como en un entorno conda diferente cuando dos tienen instalaciones conflictivas de componentes necesarios). Cuento al menos 40 puntos potenciales en los que este trozo de código está posiblemente generando procesos hijo, y lo enhebro para que lo haga de forma concurrente por muchos hilos que haya (así, en una máquina de 12 hilos, 12x40 en el transcurso de ~10 segundos). No me parece que esto deba hacer que mi sistema consuma tanta CPU, pero esa es mi mejor suposición por el momento.
Posiblemente relacionado, el taskgated
está constantemente escupiendo a los archivos de registro, "MacOS error: -67062", que de nuevo he buscado y no encontró suerte con el diagnóstico del problema. Y, diskarbitrationd
está generando un montón de mensajes "<private>" en la Consola, pero su CPU% está en torno al 0,3% así que me preocupa menos.
Mis disculpas por divagar un poco aquí, pero estoy tratando de proporcionar la información que tengo, y espero que alguien aquí tiene una idea. Si puedo deshacerme de este problema del 25% o más, eso puede ahorrar meses de tiempo.
Por si sirve de algo, estoy ejecutando MacOS 10.14.5 y ..4 en dos ordenadores de sobremesa, y 10.15.5 en un portátil. El mismo problema para todos. Corriendo en Linux en una construcción de sistema de 36 hilos casi idéntica no tiene el problema de sobrecarga (pero realmente no quiero cambiar a Linux) que es otra razón por la que no creo que sea un problema de E/S de disco.