Conceptos sobre generación de perfiles

La creación de perfiles es una forma de análisis de código dinámico. Se capturan características de la aplicación mientras se ejecuta y, luego, se usa esta información para identificar cómo hacer que la aplicación sea más rápida y eficiente.

Históricamente, la creación de perfiles se realizaba solo durante el desarrollo de la aplicación. Este enfoque se basaba en la capacidad de desarrollar pruebas de carga y comparativas que podrían predecir con precisión un entorno de producción.

Creación de perfiles continua hace referencia a la creación de perfiles de la aplicación mientras esta se ejecuta en un entorno de producción. Este enfoque mitiga la necesidad de desarrollar pruebas de carga y comparativas predictivas y precisas para el entorno de producción. Las investigaciones sobre creación de perfiles continua demostraron que son precisas y rentables*.

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ísticos o de muestreo que tiene una sobrecarga baja y es adecuado para entornos de producción.

  • Admite lenguajes comunes y recopila varios tipos de perfil. Consulta la sección Tipos de perfiles disponibles para obtener una descripción general.

Configurar una aplicación de Google Cloud para generar datos de perfil es un proceso simple y único: vincula o ejecuta tu servicio con un agente de creación de perfiles incluido. Después de que se implementa tu aplicación, el agente de creación de perfiles se ejecuta periódicamente para recopilar datos de rendimiento y, luego, enviarlos a tu proyecto de Google Cloud. Para obtener detalles sobre este proceso, consulta Colección de perfiles.

Una vez que hayas recopilado datos de perfil para tu aplicación, puedes analizarlos mediante la interfaz de Profiler. Por lo general, el análisis de los datos de perfil es un proceso iterativo que se basa en tu conocimiento del diseño de la aplicación y su lenguaje de programación.

*Consulta las publicaciones sobrecreación de perfiles en todo Google: una infraestructura de creación de perfiles continua para centros de datos y creación de perfiles continua: ¿dónde se fueron todos los ciclos?.

Tipos de perfiles disponibles

En la siguiente tabla, se resumen los tipos de perfiles compatibles:

Tipo de perfil Go Java Node.js Python
Tiempo de CPU
Montón
Montón asignado
Contención
Subprocesos
Tiempo S

En la parte restante de sección, se proporcionan más detalles sobre cada uno de estos tipos de perfil.

Mediciones de tiempo

  • El tiempo de CPU es el tiempo que la CPU invierte en la ejecución de un bloque de código.

    El tiempo de CPU de una función te indica cuánto tiempo estuvo ocupada ejecutando instrucciones. No incluye el tiempo que la CPU estuvo esperando o procesando las instrucciones.

  • Las horas reales (también llamado tiempo) es el tiempo que lleva ejecutar un bloque de código.

    La hora real para una función mide el tiempo transcurrido entre la entrada y la salida de una función. La hora real incluye todo el tiempo de espera, incluido el de la sincronización de bloqueos y subprocesos. El tiempo para un bloque de código nunca puede ser inferior al tiempo de CPU.

Si el tiempo es más largo que el tiempo de CPU, eso indica que que el tiempo de espera del código es largo. Cuando la diferencia es sustancial, es posible que tu aplicación tenga un cuello de botella de recursos.

Si el tiempo de CPU es parecido al tiempo, entonces eso indica que el bloque de código hace un uso intensivo de la CPU. Esto significa que casi todo el tiempo que tarda en ejecutarse se dedica a la CPU. Los bloques de código de uso intensivo de CPU de larga duración pueden ser candidatos para la optimización.

Uso del montón (memoria)

  • El uso del montón (también llamado heap) es la cantidad de memoria asignada en el montón del programa en el instante en que se recopila el perfil. A diferencia de otros tipos de perfiles en los que los datos se recopilan durante un intervalo, el tipo de perfil recopila el uso del montón en un momento determinado.

  • La asignación de montón (también llamada montón asignado) es la cantidad total de memoria que se asignó en el montón del programa durante el intervalo en el que se recopiló el perfil. Este valor incluye cualquier memoria que se asignó y se liberó, y ya no esté en uso. Por ejemplo, considera un trabajo que repite la siguiente secuencia: asigna 1 MiB, espera 500 msec, libera 1 MiB y espera 500 ms. En los 10 segundos en los que se recopila el perfil de montón asignado, hay 10 asignaciones y 10 liberaciones. Este perfil mostraría 10 MiB asignados al montón, ya que las liberaciones no se consideran. La tasa de asignación promedio es de 10 MiB cada 10 segundos o 1 MiB por segundo.

La creación de perfiles de uso de montón te ayuda a encontrar posibles ineficiencias y fugas de memoria en tus programas. La creación de perfiles de asignaciones de montón te ayuda a saber qué asignaciones le generan más trabajo al recolector de elementos no utilizados.

Información de subprocesos

Las aplicaciones que crean subprocesos pueden tener subprocesos bloqueados y filtraciones de subprocesos:

  • Los subprocesos bloqueados son subprocesos que se crean, pero están esperando un bloqueo. Estos subprocesos no están en ejecución y es posible que nunca se ejecuten. Sin embargo, un subproceso bloqueado podría ejecutarse en algún momento.
  • Las filtraciones de subprocesos ocurren cuando la cantidad de subprocesos creados sigue aumentando.

Los subprocesos bloqueados son una de las causas de los subprocesos filtrados.

A nivel de marco, el perfil de Subproceso muestra la cantidad promedio de subprocesos que incluyen ese marco. Este tipo de perfil recopila el uso de subprocesos en un momento determinado.

Contención

En un programa de varios subprocesos, el tiempo de espera para serializar el acceso a un recurso compartido puede ser significativo. Comprender el comportamiento de contención puede guiar el diseño del código y proporcionar información para ajustar el rendimiento.

Colección de perfiles

La función del agente de creación de perfiles es capturar los datos del perfil de tu aplicación y transmitirlos al backend de Profiler mediante la API de Profiler. Cada perfil sirve para una sola instancia de una aplicación e incluye cuatro campos que identifican su implementación de manera única:

  • Proyecto de Google Cloud
  • Nombre de la aplicación
  • Zona de la aplicación
  • Versión de la aplicación

Cuando un agente está listo para capturar un perfil, emite un comando de la API de Profiler al backend de Profiler. El backend recibe esta solicitud y, en la situación más simple, responde de inmediato al agente. La respuesta especifica el tipo de perfil que se capturará. En respuesta, el agente captura el perfil y lo transmite al backend. Por último, el backend de Profiler asocia el perfil con tu proyecto de Google Cloud. Luego, puedes verlo y analizarlo con la interfaz de Profiler.

La secuencia de protocolo de enlace real es más compleja que la descrita en el párrafo anterior. Por ejemplo, cuando el generador de perfiles recibe una solicitud de un agente, el backend verifica su base de datos para determinar si recibió solicitudes anteriores del agente. De lo contrario, el backend agrega la información del agente a su base de datos. Si los campos de implementación del agente no coinciden con los de ningún otro agente registrado, se crea una implementación nueva.

Cada minuto, en promedio, y para cada implementación y 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 montón y tiempo, se captura un promedio de 2 perfiles por minuto:

  • Para todos los tipos de perfil, excepto los subprocesos y el uso de montón, un solo perfil representa los datos recopilados durante 10 segundos.

  • El uso del montón y los perfiles de subprocesos se recopilan de forma instantánea.

Después de que el agente notifica al backend de Profiler que está listo para capturar datos, permanece inactivo hasta que el backend responda con el tipo de perfil que debe capturar. Si tienes 10 instancias de una aplicación en ejecución en la misma implementación, entonces crearás 10 agentes de creación de perfiles. Sin embargo, la mayoría de las veces estos agentes están inactivos. En un período de 10 minutos, puedes contar con 10 perfiles. En promedio, cada agente recibe una respuesta para cada tipo de perfil. Existe cierta aleatorización, por lo que la cantidad real puede variar.

El backend de Profiler usa las cuotas de la API de Profiler y los campos de implementación de perfiles para limitar los perfiles transferidos. Para obtener información sobre cómo ver y administrar tus cuotas de Profiler, consulta Cuotas y límites.

Analiza datos

Una vez que Profiler haya recopilado los datos, podrás verlos y analizarlos con la interfaz de Profiler.

En el panel de navegación de la consola de Google Cloud, selecciona Profiler:

Ir al Generador de perfiles