Solucionar 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:
-
Enable the required API.
Si se muestra API habilitada, 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
comostart
si estás realizando la ejecución fuera de Google Cloud. Para obtener más información, consulta la funciónstart
.
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 asignal.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 cómo crear perfiles de aplicaciones que se ejecutan 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:
Asegúrate de que el tipo de perfil sea compatible con el lenguaje de tu aplicación. Para obtener más información, consulta Tipos de perfiles disponibles.
Asegúrate de usar una versión de servicio nueva después de cambiar los tipos de perfil que se recopilan. Si no especificas una versión de servicio nueva, se usa una implementación existente y el agente de creación de perfiles no puede transferir los datos para el tipo de perfil recién habilitado. Para obtener más información sobre las implementaciones, consulta la sección sobre recolección de perfiles.
Asegúrate de que el tipo de perfil esté habilitado. Algunos tipos de perfiles están inhabilitados de forma predeterminada. Para obtener más información, consulta las páginas de lenguajes individuales:
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.