2 votos

¿Qué causa el uso excesivo de la CPU por parte de los procesos taskgated, notifyd y launchd?

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.

0voto

Steve Evans Puntos 155

¿Tu pregunta es para entender mejor MacOS o para que tu código Python se complete más rápido? Sospecho que es lo segundo.

Si es así, ¿has perfilado su código Python ? ¿Qué muestra el perfil de rendimiento?

MacOS

taskgated y launchd participan en la evaluación y el lanzamiento de los procesos.

Activa la función de MacOS modo de rendimiento del servidor para elevar los límites de los recursos.

Si se sospecha que la causa es la falta de firma de código, se puede signo de código ad-hoc sus binarios - y los de los demás:

sudo codesign -f -s - <full path to bundle or executable>

Procesos externos

Los procesos generados varían en longevidad, es cualquier cosa desde un simple comando de terminal "mv" hasta la ejecución de otro programa que puede tomar desde segundos hasta horas, aunque la mayoría están en el lado más corto.

En cualquier sistema operativo, evite llamar a procesos externos cuando exista una llamada dentro del lenguaje. Lanzar un proceso y esperar a que termine es caro, comparado con una llamada al sistema.

Ver Python - ¿Cómo mover un archivo? para sustituir mv con os.rename() , shutil.move() o os.replace() .

Hilos

Añadir hilos a su proceso no garantiza que las llamadas al sistema operativo no se pongan en cola y se manejen de forma secuencial.

Los hilos en Python son hilos posix y, por tanto, gestionado por el sistema operativo. Añadir hilos da al sistema operativo subyacente más trabajo y más influencia en el rendimiento de su proceso. En este sentido, la diferencia entre Linux y MacOS es significativa.

Utilice hilos para manejar la manipulación de datos y, cuando sea posible, pase el trabajo de manejo de archivos a un hilo de manejo de archivos dedicado. Evite tocar el disco a menos que sea absolutamente esencial para continuar con la siguiente tarea. Incluso entonces, intente pasar datos hacia y desde otros procesos utilizando tubos o comunicación entre procesos (IPC).

Utilice unidades de estado sólido (SSD) en lugar de discos duros giratorios (HDD).

Linux

Dado que parece que has comprobado que Linux es más rápido que MacOS, utiliza Linux.

Docker

Para ahorrar meses, justificaría 1 - 2 días experimentando con Docker . Este enfoque le permitirá ejecutar una instancia ligera de Linux en su Mac y evitar los costes probados de MacOS. Esto debería aliviar el costo de los procesos de desove.

Habrá una desafortunada curva de aprendizaje para Docker, pero será un tiempo bien empleado.

El uso de Docker le proporcionará un entorno de trabajo bien definido que puede iniciarse, detenerse y replicarse sin vínculos con el sistema operativo anfitrión.

¿Imprescindible?

Hay que tener cuidado con asumir que el 20-25% del tiempo del sistema no es útil, y es evitable. MacOS es un sistema operativo pesado en comparación con Linux. La informática de alto rendimiento utiliza sistemas operativos específicos por una razón. Si usar Linux es fácil y se obtienen los resultados más rápido, dedicar tiempo a MacOS parece injustificable.

0voto

Dustin Martin Puntos 447

Creo que la sobrecarga que tienes con los demonios a los que te refieres son inevitables en MacOS. Por ejemplo, launchd es el proceso principal para el lanzamiento de aplicaciones y asegura que los procesos que lanzó se mantengan vivos si así se le indica. El uso de más hilos en MacOS es un problema bien conocido en relación con una mayor sobrecarga para el núcleo. Por ello, la documentación de Apple indica claramente que hay que utilizarlos con criterio y con moderación. Además, parece que MacOS no se fía de tu script, ya que es un "ejecutable" sin firma y al que corresponde el error que estás obteniendo:

error de seguridad -67062 Error: 0xFFFEFA0A -67062 el objeto de código no está firmado en absoluto

Por lo tanto, la sobrecarga adicional que está viendo es muy probablemente debido a Gatekeeper, que está constantemente comprobando lo que su script está generando y haciendo.

Posibles soluciones (parciales) a su problema:

  1. Incrusta tu script en una aplicación firmada - esto es lo que recomienda Apple en la nota técnica TN2206 .
  2. Utilice Linux en su lugar

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X