Extraiga la información básica utilizando powermetrics
, monitoriza con tu herramienta favorita. Sin embargo, ten cuidado, y considera si vale la pena el esfuerzo.
Identificación de núcleos P/E
A diferencia de lo que ocurre en iOS, esto es afortunadamente bastante fácil en MacOS. Utilizando la función powermetrics
podemos identificar qué núcleos son los de rendimiento (P) y cuáles son los de eficiencia (E). Desgraciadamente, no tengo un Mac equipado con Apple Silicon, así que estas capturas de pantalla son cortesía de Matthew Panzarino en Twitter . Si tiene tiempo, también le recomiendo que lea su artículo de TechCrunch sobre la M1.
> sudo powermetrics -s cpu_power
(Probablemente, no estoy 100% seguro del comando)
Aunque no tengo ninguna fuente para ello, no me sorprendería que los núcleos 0-3 sean núcleos E y los núcleos 4-7 sean núcleos P en todos los chips M1. Aun así, te recomiendo que lo compruebes por ti mismo.
¡Genial! A las carreras entonces, ¿no?
El monitor de actividad como ejemplo
El Monitor de Actividad tiene una buena función para supervisar el uso de la CPU por núcleo, oculta en Ventana -> Historial de la CPU (acceso directo ⌘ + 2 .) top/htop/Glances/iStats/Task Manager/ cualquiera que sea tu aplicación de estado favorita probablemente tenga algo similar.
Sin embargo, enseguida notarás un problema. Mientras que la carga total de cada núcleo es inmediatamente evidente, qué hace qué y dónde no lo es en absoluto. A la inversa, podemos ver qué está haciendo qué con bastante facilidad si miramos la ventana normal del Monitor de Actividad, pero no en qué núcleo. Incluso en algo como htop, que proporciona fácilmente información y herramientas mucho más potentes que el Monitor de Actividad, conseguir que muestre (incluso a nivel de proceso) lo que está en cada núcleo en particular no es una tarea fácil.
Programación y otras cosas (más o menos)
Es en este punto donde tenemos que abordar el hecho de que los programas no se ejecutan en un solo núcleo para siempre. Advertencia: No soy en absoluto un experto en sistemas operativos, así que haré todo lo posible para abordar las cosas desde un nivel alto. Si hay errores, no dudes en editar o dejar un comentario.
Los sistemas modernos suelen contener al menos un planificador, manejado por el SO (normalmente dentro del núcleo) que decide qué se ejecuta cuándo y en qué recursos físicos. En MacOS (y en otros Darwin ), esto toma la forma de una cola dentro del núcleo de Mach. Sin embargo, los SO de Apple también contienen una segunda capa de bibliotecas diseñadas para ayudar en esta tarea a un nivel superior. El sistema Grand Central Dispatch ( GCD ) es el enfoque principal de Apple para esto: contiene un montón de clases útiles que pueden ser utilizadas por los desarrolladores para ayudar a optimizar su aplicación. A su vez, GCD programa el código para que se ejecute en una variedad de hilos, que entrega al sistema operativo para que decida qué se ejecuta en qué núcleo. Todo esto se cambia constantemente para aprovechar al máximo los recursos de hardware disponibles.
Espero que sea posible ver cómo las cosas están un poco desordenadas en este punto. Aunque esto no es en absoluto imposible de desentrañar, es un poco complicado, especialmente cuando tantas herramientas se han construido con la suposición de núcleos homogéneos.
Soluciones
Idealmente, nos gustaría algo que (agrupado por proceso) mostrara cuánto se utilizó cada núcleo individual por todos los hilos que pertenecen o son utilizados por ese proceso. Desafortunadamente, no he sido capaz de encontrar nada. El problema es que todo lo que he encontrado no registra qué está usando qué núcleo de una manera que sea fácil de tratar. Por ejemplo Quiero saber qué proceso posee qué hilos y en qué núcleo se está ejecutando un hilo en htop
? Fácil, activa la vista de árbol y habilita la columna PROCESADOR. Pero, ¿quieres que te ordene por los procesos que más utilizan unos pocos núcleos? Buena suerte.
Aunque estoy seguro de que hay una manera de hacer que funcione -siempre que se trate de herramientas de código abierto-, no es algo fácil o sencillo que yo conozca. Aparte de estas herramientas de uso general, ¿hay alguna otra opción?
Perfilado
Al igual que con una arquitectura de CPU homogénea, si realmente quieres saber lo que ocurre dentro de tu aplicación, la mejor manera de hacerlo es perfilándola. Esto es cierto para averiguar en qué núcleo se está ejecutando, entre otras cosas.
La forma de hacerlo dependerá de cómo esté construida la aplicación. Para aplicaciones nativas de Mac, Instrumentos de Apple (integradas en Xcode) pueden proporcionar una gran visión de lo que se está ejecutando y dónde. Para las aplicaciones Electron, puede utilizar Herramientas de rendimiento en tiempo de ejecución de Chrome ya que Electron es básicamente Chrome; sin embargo, no estoy particularmente familiarizado con él.
La cosa es que están pensados como herramientas de desarrollo. Requieren configuración, (normalmente) requieren algún acceso al código fuente (o algo parecido) para funcionar bien, proporcionan mucha información, y no siempre son fáciles de trabajar. Lo que nos lleva al siguiente punto:
¿Por qué?
Soy tan fanático como el que más de saber por saber; es genial poder ver qué hace qué y jugar con tu flujo de trabajo. Pero considera por un segundo lo que realmente estás viendo: algunos números (probablemente) muy situacionales y complicados con los que es francamente difícil trabajar. Optimizar el software ya es bastante difícil cuando es tu trabajo; como usuario final, es un juego completamente distinto.
Así que, aunque me encantaría verlo tanto como al siguiente, sugiero que... no te preocupes demasiado por ello. Mira la utilización total por núcleo, seguro; mira el consumo de energía por aplicación. Pero en términos de qué está en qué núcleo bajo qué condiciones, no te preocupes por ello.
Por supuesto, si alguien da con una herramienta, me encantaría verla :)