Solución de problemas

En esta página, se muestra cómo resolver problemas con Cloud Profiler.

Errores con la configuración de tu proyecto de Google Cloud

En esta sección, se enumeran los errores de configuración que puedes encontrar y se proporcionan sugerencias para solucionarlos.

La API de Cloud Profiler está inhabilitada

El siguiente error ocurre cuando la API de Profiler no está habilitada para tu proyecto de Google Cloud:

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = Cloud Profiler API has not been used in project 012345 before or it is disabled.

Para resolver este problema, tu proyecto de Google Cloud debe tener habilitada la API de Profiler:

  1. En el panel de navegación de la consola de Google Cloud, selecciona API y servicios, haz clic en Habilitar APIs y servicios y, luego, habilita la API de Cloud Profiler:

    Ir a la configuración de la API de Profiler

  2. Si aparece API habilitada, significa que la API ya está habilitada. De lo contrario, haz clic en el botón Habilitar.

El emisor no tiene permisos

El siguiente error ocurre cuando no tienes el permiso para escribir datos de creación de perfiles en un proyecto de Google Cloud:

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = The caller does not have permission.

Para resolver este problema, pídele a tu administrador que te otorgue permisos adicionales en ese proyecto. Para obtener una lista detallada de los permisos y funciones necesarios, consulta la sección sobre control de acceso.

Errores con Node.js

En esta sección, se enumeran los problemas que puedes encontrar cuando usas el agente de creación de perfiles de Node.js y se brindan sugerencias para solucionar cada uno de ellos.

La aplicación no sale con normalidad con Node.js

El agente de creación de perfiles para Node.js interfiere en la salida normal del programa. El programa puede tardar hasta una hora en salir después de completar todas las tareas.

Para resolver este problema, emite una señal SIGINT, por ejemplo, mediante Ctrl-C. Cuando emites una señal SIGINT, el proceso finaliza de forma correcta.

Errores con Python

En esta sección, se enumeran los problemas que puedes encontrar cuando usas el agente de creación de perfiles de Python y se proporcionan sugerencias sobre cómo corregir cada uno de ellos.

Excepción NotImplementedError con Python

La siguiente excepción se muestra durante la ejecución de la función start cuando la aplicación se ejecuta en un entorno que no es de Linux:

NotImplementedError

Para resolver este problema, ejecuta tu aplicación en un entorno de Linux.

Excepción ValueError con Python

La siguiente excepción se muestra durante start cuando los argumentos de la función no son válidos, cuando la información necesaria no se puede determinar a partir de las variables de entorno y los argumentos, o cuando el tiempo de CPU y la creación de perfiles del tiempo inhabilitadas:

ValueError

Para solucionar este problema, verifica todo lo siguiente:

  • Asegúrate de que el nombre y la versión del servicio cumplan con los requisitos definidos en la sección sobre argumentos de la versión y del nombre del servicio.
  • Si la creación de perfiles de tiempo está habilitada, asegúrate de que se llame a start desde el subproceso principal.
  • Asegúrate de usar una versión de Python compatible y de que la creación de perfiles de tiempo de CPU o tiempo esté habilitada. Para obtener más información, consulta la función start.
  • Verifica que hayas especificado el parámetro project_id como start si estás realizando la ejecución fuera de Google Cloud. Para obtener más información, consulta la función start.

Recurso no disponible temporalmente con Python

El registro de errores contiene las siguientes entradas después de habilitar el generador de perfiles:

BlockingIOError: [Errno 11] Resource temporarily unavailable
Exception ignored when trying to write to the signal wakeup fd

Estos mensajes ocurren cuando una aplicación se registra con el descriptor de archivo de activación de señal, signal.set_wakeup_fd. De forma predeterminada, si se llena el búfer del descriptor de archivo, entonces se registra una advertencia en stderr.

Cuando Cloud Profiler recopila perfiles, activa señales con alta frecuencia y puede llenar el descriptor de archivo de señal. Para obtener el problema de GitHub, consulta BlockingIOError en App Engine.

Para solucionar este problema, realiza una de las siguientes acciones:

  • Si tu aplicación puede ejecutarse de manera segura cuando se pierden los indicadores, puedes usar Cloud Profiler. Si usas Python 3.7 o una versión posterior y deseas inhabilitar los mensajes de advertencia, pasa warn_on_full_buffer=False como un parámetro a signal.set_wakeup_fd.

  • Si tu aplicación no se puede ejecutar de forma segura cuando se pierden los indicadores, entonces, te recomendamos dejar de usar Cloud Profiler. El uso continuo puede causar la pérdida de números de señal y entradas excesivas en el registro de errores.

Faltan todos los perfiles

Estas son dos razones comunes por las que quizá no veas ningún perfil:

  • El servicio no se ejecuta por suficiente tiempo para recopilar los perfiles.
  • El servicio no está configurado para la autenticación.

Para resolver problemas relacionados con un tiempo de ejecución breve, asegúrate de que el servicio se ejecute de forma continua durante al menos 3 minutos.

Para resolver problemas relacionados con la autenticación, asegúrate de que el agente de creación de perfiles pueda escribir datos en tu proyecto de Google Cloud:

  • Si tu servicio se ejecuta en Google Cloud, la autenticación es automática, excepto cuando implementas un contenedor en Compute Engine. Cuando implementas un contenedor en Compute Engine, debes especificar el ID de tu proyecto de Google Cloud en el comando start del agente de Profiler. Para obtener instrucciones, consulta la sección sobre cómo vincular el agente a un proyecto de Google Cloud.

  • Si tu servicio se ejecuta fuera de Google Cloud, debes crear una cuenta de servicio y vincular el agente de Profiler a tu proyecto de Google Cloud. Para obtener más información, consulta la sección sobre creación de perfiles fuera de Google Cloud.

Faltan los perfiles de un tipo específico

En esta sección, se enumeran las configuraciones específicas en las que no se recopilan perfiles para uno o más tipos de perfil. La primera sección incluye contenido general y las demás secciones enumeran problemas relacionados con lenguajes específicos.

Información general

Si deseas ver un tipo de perfil específico, pero no existen perfiles de ese tipo disponibles, verifica lo siguiente:

En las secciones restantes de esta página, se describen las configuraciones específicas de cada lenguaje en las que no se recopilan datos para un tipo de perfil.

Go: No se recopilan perfiles de tiempo de CPU para c-archives

Cuando se compila una aplicación Go con la marca -buildmode establecida en c-archive o c-shared, la generación de perfiles de tiempo de CPU se encuentra inhabilitada de forma predeterminada. Se recopilan perfiles de montón, contención y subprocesos. Para obtener más información, consulta Error n.º 99 de GitHub: El generador de perfiles no recopila datos de CPU para el código de Go en un archivo c.

Para resolver este error, habilita la recopilación de perfiles de tiempo de CPU antes de que tu servicio llame a profiler.Start y agrega una llamada a signal.Notify(make(chan os.Signal), syscall.SIGPROF). Para obtener más información sobre signal.Notify, consulta func Notify.

Java: Los perfiles de montón no se recopilan cuando se habilitan varios generadores de perfiles.

Habilitaste varios generadores de perfiles de montón para una aplicación de Java y no tienes perfiles.

Las muestras del montón de Java se habilita como una función de agente individual. Como resultado, solo se puede usar un generador de perfiles a la vez. Se abrió un error para extender Java a fin de admitir varios generadores de perfiles del montón. A fin de obtener información sobre ese error, consulta Agrega compatibilidad con varios agentes para el mecanismo de muestreo de montón.

Para solucionar este problema, habilita un generador de perfiles.

Python: no hay tiempo de CPU ni perfiles de tiempo cuando se usa uWSGI

Cuando uWSGI usa varios trabajadores para manejar las solicitudes, el comportamiento predeterminado es realizar la inicialización de la aplicación solo en el proceso (master) principal. Los procesos bifurcados no realizan la secuencia de inicialización.

Si configuras el agente de creación de perfiles en la secuencia de inicialización de tu aplicación, por ejemplo, configuras el agente de creación de perfiles en el método AppConfig.ready() de una aplicación Django, el agente de creación de perfiles no está configurado para los procesos bifurcados.

Para solucionar este problema, establece la marca lazy-apps como true a fin de realizar la inicialización de la aplicación en todos los procesos de trabajadores.

Python: tienen perfiles de tiempo de CPU, pero no perfiles de tiempo cuando se usa uWSGI

El generador de perfiles de tiempo depende del módulo de indicador de Python. Cuando el intérprete de Python se compila con compatibilidad de subprocesos, la configuración predeterminada inhabilita el manejo de indicadores personalizados para los procesos bifurcados.

A fin de resolver este problema, en el caso de las aplicaciones de uWSGI, habilita el control de señal personalizado. Para ello, configura la marca py-call-osafterfork como true.

Python: No hay perfiles para procesos bifurcados.

Los agentes de creación de perfiles solo pueden generar perfiles del proceso que inició el agente.

Para resolver este problema, si tu aplicación bifurca los procesos y deseas recopilar perfiles de los procesos bifurcados, inicializa el agente después de realizar la bifurcación.