Conceptos de la elaboración de perfiles
La creación de perfiles es una forma de análisis de código dinámico. Capturas las características de la aplicación mientras se ejecuta y, a continuación, usas esta información para identificar cómo hacer que tu aplicación sea más rápida y eficiente.
Históricamente, la creación de perfiles solo se realizaba durante el desarrollo de la aplicación. Este enfoque se basaba en la capacidad de desarrollar pruebas de carga y comparativas que pudieran predecir con precisión un entorno de producción.
Creación de perfiles continua: se refiere a la creación de perfiles de la aplicación mientras se ejecuta en un entorno de producción. De esta forma, no es necesario desarrollar pruebas de carga predictivas ni comparativas precisas para el entorno de producción. Las investigaciones sobre la creación de perfiles continuos han demostrado que es un proceso preciso y rentable.*
Cloud Profiler es una herramienta de creación de perfiles continua diseñada para aplicaciones que se ejecutan en Google Cloud:
Es un generador de perfiles estadístico o de muestreo que tiene una sobrecarga baja y es adecuado para entornos de producción.
Admite idiomas habituales y recoge varios tipos de perfil. Consulta un resumen de los tipos de creación de perfiles disponibles.
Configurar una aplicación para generar datos de perfil es un proceso sencillo que se realiza una sola vez: vincula o ejecuta tu servicio con un agente de creación de perfiles incluido. Google Cloud Una vez que se haya implementado la aplicación, el agente de creación de perfiles se ejecutará periódicamente para recoger datos de rendimiento y, a continuación, enviará esos datos a tu proyecto de Google Cloud . Para obtener más información sobre este proceso, consulta el artículo Recogida de datos de perfiles.
Una vez que hayas recogido datos de perfil de tu aplicación, podrás analizarlos mediante la interfaz de Profiler. Analizar los datos de perfil suele ser un proceso iterativo que se basa en tu conocimiento del diseño de la aplicación y de su lenguaje de programación.
*Consulta los siguientes artículos: Google-Wide Profiling: A Continuous Profiling Infrastructure for Data Centers y Continuous Profiling: Where Have All the Cycles Gone?.
Tipos de elaboración de perfiles disponibles
En la siguiente tabla se resumen los tipos de perfil admitidos:
Tipo de perfil | Go | Java | Node.js | Python |
---|---|---|---|---|
Tiempo de CPU | Y | S | Y | |
Montículo | Y | S | Y | |
Montículo asignado | Y | |||
Contención | Y | |||
Conversaciones | Y | |||
Tiempo real | Y | S | Y |
En el resto de esta sección se ofrece más información sobre cada uno de estos tipos de perfil.
Mediciones de tiempo
El tiempo de CPU es el tiempo que la CPU dedica a ejecutar un bloque de código.
El tiempo de CPU de una función indica cuánto tiempo ha estado la CPU ocupada ejecutando instrucciones. No incluye el tiempo que la CPU ha estado esperando o procesando instrucciones para otra tarea.
El tiempo real transcurrido (también llamado tiempo de ejecución) es el tiempo que se tarda en ejecutar un bloque de código.
El tiempo real de una función mide el tiempo transcurrido entre el momento en que se accede a una función y el momento en que se sale de ella. El tiempo real incluye todo el tiempo de espera, incluido el de los bloqueos y la sincronización de los hilos. El tiempo real de un bloque de código nunca puede ser inferior al tiempo de CPU.
Si el tiempo real es superior al tiempo de CPU, significa que el código pasa tiempo esperando. Si la diferencia es considerable, es posible que tu aplicación tenga un cuello de botella de recursos.
Si el tiempo de CPU es similar al tiempo real, significa que el código requiere mucha CPU, ya que la CPU dedica casi todo el tiempo de ejecución. Los bloques de código largos que requieren un uso intensivo de la CPU pueden ser candidatos para la optimización.
Uso de montículo (memoria)
El uso del montículo (también llamado montículo) es la cantidad de memoria asignada en el montículo del programa en el momento en que se recoge el perfil. A diferencia de otros tipos de perfiles en los que los datos se recogen durante un intervalo, este tipo de perfil recoge el uso del montículo en un momento concreto.
La asignación de montículo (también llamada montículo asignado) es la cantidad total de memoria que se asignó al montículo del programa durante el intervalo en el que se recogió el perfil. Este valor incluye la memoria que se ha asignado, se ha liberado y ya no se usa. Por ejemplo, considera un trabajo que repite la siguiente secuencia: asigna 1 MiB, espera 500 ms, libera 1 MiB y espera 500 ms. En los 10 segundos en los que se recoge el perfil de montículo asignado, hay 10 asignaciones y 10 liberaciones. En este perfil se mostraría un montón asignado de 10 MiB, ya que no se tienen en cuenta las liberaciones. La tasa media de asignación es de 10 MiB/10 segundos, es decir, 1 MiB por segundo.
El análisis del uso del montículo te ayuda a encontrar posibles ineficiencias y fugas de memoria en tus programas. La creación de perfiles de asignaciones de montículo te ayuda a saber qué asignaciones están causando la mayor carga de trabajo al recolector de elementos no utilizados.
Información sobre el enhebrado
Las aplicaciones que crean subprocesos pueden sufrir bloqueos y fugas de subprocesos:
- Los hilos bloqueados son hilos que se crean, pero que están esperando un bloqueo. Estos hilos no se están ejecutando y es posible que no se ejecuten nunca. Sin embargo, un hilo bloqueado puede ejecutarse en algún momento.
- Las fugas de subprocesos se producen cuando el número de subprocesos creados aumenta continuamente.
Los hilos bloqueados son una de las causas de las filtraciones de hilos.
En el nivel de fotograma, el perfil Hilo muestra el número medio de hilos que incluyen ese fotograma. Este tipo de perfil recoge el uso de los hilos en un momento concreto.
Contención
En un programa multihilo, el tiempo dedicado a esperar para serializar el acceso a un recurso compartido puede ser significativo. Conocer el comportamiento de la contención puede orientar el diseño del código y proporcionar información para optimizar el rendimiento.
Recogida de perfiles
El agente de creación de perfiles se encarga de recoger datos de perfil de tu aplicación y de transmitirlos al backend de Profiler mediante la API de Profiler. Cada perfil corresponde a una sola instancia de una aplicación e incluye cuatro campos que identifican de forma única su implementación:
- Google Cloud proyecto
- Nombre de la aplicación
- Zona de aplicación
- Versión de la aplicación
Cuando un agente está listo para capturar un perfil, envía un comando de la API Profiler al backend de Profiler. El backend recibe esta solicitud y, en el caso más sencillo, responde inmediatamente al agente. La respuesta especifica el tipo de perfil que se va a capturar. En respuesta, el agente captura el perfil y lo transmite al backend. Por último, el backend de Profiler asocia el perfil a tu proyecto de Google Cloud . A continuación, puedes verlo y analizarlo con la interfaz de Profiler.
La secuencia de handshake real es más compleja de lo que se describe en el párrafo anterior. Por ejemplo, cuando el creador de perfiles recibe una solicitud de un agente, el backend comprueba su base de datos para determinar si ha recibido solicitudes anteriores del agente. Si no es así, el backend añade la información del agente a su base de datos. Se crea una nueva implementación si los campos de implementación del agente no coinciden con los ajustes de ningún otro agente registrado.
Cada minuto, de media, y para cada implementación y cada tipo de perfil, el backend selecciona un agente y le indica que capture un perfil. Por ejemplo, si los agentes de una implementación admiten la creación de perfiles de tiempo real y de tiempo de espera, se capturan dos perfiles de media cada minuto:
En todos los tipos de perfil, excepto en los de uso de montículo y de hilos, un perfil representa los datos recogidos durante 10 segundos.
El uso del montículo y los perfiles de los hilos se recogen al instante.
Una vez que el agente notifica al backend de Profiler que está listo para recoger datos, el agente permanece inactivo hasta que el backend responde con el tipo de perfil que debe recoger. Si tienes 10 instancias de una aplicación que se ejecutan en la misma implementación, crea 10 agentes de creación de perfiles. Sin embargo, la mayoría de las veces estos agentes están inactivos. En un periodo de 10 minutos, puedes esperar 10 perfiles. De media, cada agente recibe una respuesta por cada tipo de perfil. Hay un cierto grado de aleatorización, por lo que el número real puede variar.
El backend de Profiler usa las cuotas de la API de Profiler y los campos de implementación de perfil para limitar los perfiles ingeridos. Para obtener información sobre cómo ver y gestionar tus cuotas de Profiler, consulta Cuotas y límites.
Análisis de datos
Una vez que Profiler haya recogido datos, podrá verlos y analizarlos mediante la interfaz de Profiler.
En la Google Cloud consola, ve a la página Perfilador:
También puedes encontrar esta página mediante la barra de búsqueda.