Solucionar problemas
En esta página se explica cómo resolver problemas con Cloud Profiler.
Errores en la configuración de tu proyecto Google Cloud
En esta sección se enumeran los problemas de configuración que puede encontrar y se ofrecen sugerencias para solucionarlos.
La API Cloud Profiler está inhabilitada
Se produce el siguiente error cuando la API Profiler no está habilitada en tu proyecto 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 solucionar este problema, tu proyecto Google Cloud debe tener habilitada la API Profiler:
-
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. Si se muestra API habilitada, significa que la API ya está habilitada. Si no es así, haz clic en el botón Habilitar.
El método llamador no tiene permiso
Se produce el siguiente error cuando no tienes 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 solucionar este problema, pide a tu administrador que te conceda permisos adicionales en ese proyecto. Para ver una lista detallada de los permisos y roles necesarios, consulta Control de acceso.
Errores con Node.js
En esta sección se enumeran los problemas que puede encontrar al usar el agente de creación de perfiles de Node.js y se ofrecen sugerencias para solucionarlos.
La aplicación no se cierra normalmente con Node.js
El agente de creación de perfiles de Node.js interfiere con la salida normal del programa. El programa puede tardar hasta una hora en cerrarse después de que se hayan completado todas las tareas.
Para solucionar este problema, emite una señal SIGINT
. Por ejemplo, puedes usar Ctrl-C
. Cuando emites una señal SIGINT
, el proceso finaliza correctamente.
Errores con Python
En esta sección se enumeran los problemas que puedes encontrar al usar el agente de creación de perfiles de Python y se ofrecen sugerencias para solucionarlos.
NotImplementedError
con Python
Se produce la siguiente excepción durante la ejecución de la función start
cuando la aplicación se ejecuta en un entorno que no es Linux:
NotImplementedError
Para solucionar este problema, ejecuta tu aplicación en un entorno Linux.
ValueError
con Python
Se produce la siguiente excepción durante start
cuando los argumentos de la función no son válidos, cuando no se puede determinar la información necesaria a partir de las variables de entorno y los argumentos, o cuando se inhabilitan tanto el tiempo de CPU como el tiempo real.
ValueError
Para solucionar este problema, comprueba lo siguiente:
- Asegúrate de que el nombre y la versión del servicio cumplan los requisitos definidos en Argumentos de nombre y versión del servicio.
- Si el perfil de pared está habilitado, asegúrate de que se llame a
start
desde el hilo principal. - Asegúrate de que estás usando una versión compatible de Python y de que la creación de perfiles de tiempo de CPU o de tiempo real está habilitada. Para obtener más información, consulta la función
start
. - Comprueba que has especificado el parámetro
project_id
comostart
si se ejecuta fuera de Google Cloud. Para obtener más información, consulta la funciónstart
.
Errores de recurso no disponible temporalmente con Python
El registro de errores contiene las siguientes entradas después de habilitar el Profiler:
BlockingIOError: [Errno 11] Resource temporarily unavailable Exception ignored when trying to write to the signal wakeup fd
Estos mensajes se producen cuando una aplicación se registra con el descriptor de archivo de activación de señales, signal.set_wakeup_fd
.
De forma predeterminada, si el búfer del descriptor de archivo se llena, se registra una advertencia en stderr.
Cuando Cloud Profiler recoge perfiles, activa señales con alta frecuencia y puede provocar que se llene el descriptor de archivo de señal. Para consultar el problema de GitHub, consulta BlockingIOError en App Engine.
Para solucionar este problema, haz una de las siguientes acciones:
Si tu aplicación puede ejecutarse de forma segura cuando se pierden las señales, puedes usar Cloud Profiler. Si usas Python 3.7 o una versión posterior y quieres inhabilitar los mensajes de advertencia, pasa
warn_on_full_buffer=False
como parámetro asignal.set_wakeup_fd
.Si tu aplicación no puede ejecutarse de forma segura cuando se pierden las señales, te recomendamos que dejes de usar Cloud Profiler. Si sigues usándolo, es posible que se pierdan números de señal y que haya demasiadas entradas en el registro de errores.
Faltan todos los perfiles
Hay dos motivos habituales por los que puede que no veas ningún perfil:
- El servicio no se ha ejecutado durante el tiempo suficiente para recoger perfiles.
- El servicio no está configurado para la autenticación.
Para solucionar los problemas relacionados con un tiempo de ejecución breve, asegúrate de que tu servicio se ejecute de forma continua durante al menos 3 minutos.
Para resolver los 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 despliegas un contenedor en Compute Engine. Cuando implementas un contenedor en Compute Engine, debes especificar elGoogle Cloud ID de tu proyecto en el comando del agente de Profiler
start
. Para obtener instrucciones, consulta el artículo sobre vincular el agente a un proyecto. Google CloudSi tu servicio se ejecuta fuera de Google Cloud, debes crear una cuenta de servicio y vincular el agente de Profiler a tu proyecto deGoogle Cloud . Para obtener más información, consulta Crear perfiles de aplicaciones que se ejecutan fuera de Google Cloud.
.
Faltan perfiles de un tipo específico
En esta sección se enumeran configuraciones específicas en las que no se recogen perfiles de uno o varios tipos de perfil. La primera sección contiene contenido general y las secciones restantes enumeran los problemas de idiomas específicos.
Información general
Si quieres ver un tipo de perfil específico, pero no hay ninguno disponible, comprueba lo siguiente:
Asegúrate de que el tipo de perfil se admita en el idioma de tu aplicación. Para obtener más información, consulta Tipos de creación de perfiles disponibles.
Asegúrate de haber usado una versión nueva del servicio después de cambiar los tipos de perfil que se recogen. Si no especificas una nueva versión del servicio, se usará una implementación ya existente y el agente de creación de perfiles no podrá transferir los datos del tipo de perfil recién habilitado. Para obtener más información sobre los despliegues, consulta la documentación sobre la recogida de datos de perfiles.
Asegúrate de que el tipo de perfil esté habilitado. Algunos tipos de perfil están inhabilitados de forma predeterminada. Para obtener más información, consulta las páginas de cada idioma:
En las secciones restantes de esta página se describen las configuraciones específicas de cada idioma en las que no se recogen datos de un tipo de perfil.
Go: no se recogen perfiles de tiempo de CPU para c-archives
Cuando se compila una aplicación Go con la marca -buildmode
definida como c-archive
o c-shared
, el perfil de tiempo de CPU se inhabilita de forma predeterminada. Se recogen los perfiles de montículo, contención y conversación.
Para obtener más información, consulta el problema de GitHub #993: el generador de perfiles no recoge datos de CPU del código Go en un archivo C.
Para solucionar este problema, habilita la recogida de perfiles de tiempo de CPU antes de las llamadas de servicio profiler.Start
y añade una llamada a signal.Notify(make(chan os.Signal), syscall.SIGPROF)
.
Para obtener más información sobre signal.Notify
, consulta func Notify
.
Java: no se recogen perfiles de montículo cuando hay varios creadores de perfiles habilitados
Has habilitado varios creadores de perfiles de montículo para una aplicación Java y no tienes ningún perfil.
El muestreador de montículo de Java se habilita como una función de agente independiente. Por lo tanto, solo se puede usar un generador de perfiles a la vez. Se ha abierto un error para ampliar Java y que admita varios generadores de perfiles de montículo. Para obtener información sobre ese error, consulta Añadir compatibilidad con varios agentes para el mecanismo de muestreo de montículos.
Para solucionar este problema, habilita un generador de perfiles.
Python: no hay tiempo de CPU ni perfiles de tiempo real al usar uWSGI
Cuando uWSGI usa varios procesos de trabajo para gestionar solicitudes, el comportamiento predeterminado es realizar la inicialización de la aplicación solo en el proceso principal (master
). 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, en el método AppConfig.ready()
de una aplicación Django), el agente de creación de perfiles no se configurará para los procesos bifurcados.
Para resolver este problema, inicializa la aplicación en todos los procesos de trabajo configurando la marca lazy-apps en true
.
Python: tiene perfiles de tiempo de CPU, pero no perfiles de tiempo real al usar uWSGI
El generador de perfiles de Wall depende del módulo de señales de Python. Cuando el intérprete de Python se compila con compatibilidad con subprocesos, la configuración predeterminada inhabilita el control de señales personalizadas para los procesos bifurcados.
Para solucionar este problema, en las aplicaciones uWSGI, habilita la gestión de señales personalizadas configurando la marca py-call-osafterfork en true
.
Python: no hay perfiles para procesos bifurcados
Los agentes de creación de perfiles solo pueden crear perfiles del proceso que inició el agente.
Para solucionar este problema, si tu aplicación bifurca procesos y quieres recoger perfiles de los procesos bifurcados, inicializa el agente después de la bifurcación.