Resolver problemas
Esta página mostra como resolver problemas com o Cloud Profiler.
Erros na configuração do projeto Google Cloud
Esta secção apresenta problemas de configuração que pode encontrar e sugestões sobre como corrigir cada um deles.
A Cloud Profiler API está desativada
O erro seguinte ocorre quando a API Profiler não está ativada para o seu projeto 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, o seu Google Cloud projeto tem de ter a API Profiler ativada:
-
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. Se for apresentada a mensagem API ativada, significa que a API já está ativada. Caso contrário, clique no botão Ativar.
O autor da chamada não tem autorização
O seguinte erro ocorre quando não tem autorização para escrever dados de criação de perfis num projeto do Google Cloud :
failed to create a profile, will retry: rpc error: code = PermissionDenied desc = The caller does not have permission.
Para resolver este problema, peça ao administrador que lhe conceda autorizações adicionais nesse projeto. Para ver uma lista detalhada das autorizações e funções necessárias, consulte o artigo Controlo de acesso.
Erros com o Node.js
Esta secção apresenta problemas que pode encontrar quando usa o agente de criação de perfis do Node.js e fornece sugestões sobre como corrigir cada um deles.
A aplicação não termina normalmente com o Node.js
O agente de criação de perfis para Node.js interfere com a saída normal do programa. Pode demorar até uma hora para que o programa termine depois de todas as tarefas no programa terem sido concluídas.
Para resolver este problema,
emita um sinal SIGINT
, por exemplo, através de Ctrl-C
. Quando emite um sinal
SIGINT
, o processo termina normalmente.
Erros com Python
Esta secção apresenta problemas que pode encontrar quando usa o agente de criação de perfis do Python e fornece sugestões sobre como corrigir cada um deles.
NotImplementedError
exceção com Python
A seguinte exceção é lançada durante a execução da função start
quando a aplicação é executada num ambiente que não é Linux:
NotImplementedError
Para resolver este problema, execute a sua aplicação num ambiente Linux.
ValueError
exceção com Python
A seguinte exceção é lançada durante start
quando os argumentos da função são inválidos, quando não é possível determinar as informações necessárias a partir das variáveis de ambiente e dos argumentos, ou quando a criação de perfis de tempo de CPU e tempo real está desativada:
ValueError
Para resolver este problema, verifique o seguinte:
- Certifique-se de que o nome e a versão do serviço cumprem os requisitos definidos nos argumentos de nome e versão do serviço.
- Se a criação de perfis de paredes estiver ativada, certifique-se de que
start
é chamada a partir da thread principal. - Certifique-se de que está a usar uma versão suportada do Python e que a criação de perfis de tempo de CPU ou tempo real está ativada. Para mais
informações, consulte a função
start
. - Verifique se especificou o parâmetro
project_id
comostart
se estiver a ser executado fora do Google Cloud. Para mais informações, consulte a funçãostart
.
Erros de recurso temporariamente indisponível com Python
O registo de erros contém as seguintes entradas após a ativação do Profiler:
BlockingIOError: [Errno 11] Resource temporarily unavailable Exception ignored when trying to write to the signal wakeup fd
Estas mensagens ocorrem quando uma aplicação se regista no descritor de ficheiros de ativação de sinais, signal.set_wakeup_fd
.
Por predefinição, se o buffer do descritor de ficheiro ficar cheio, é registado um aviso no stderr.
Quando o Cloud Profiler recolhe perfis, aciona sinais com alta frequência e pode fazer com que o descritor de ficheiros de sinais fique cheio. Para o problema do GitHub, consulte o artigo BlockingIOError no App Engine.
Para resolver este problema, faça uma das seguintes ações:
Se a sua aplicação puder ser executada em segurança quando os sinais são perdidos, pode usar o Cloud Profiler. Se estiver a usar o Python 3.7 ou posterior e quiser desativar as mensagens de aviso, transmita
warn_on_full_buffer=False
como parâmetro parasignal.set_wakeup_fd
.Se a sua aplicação não puder ser executada em segurança quando os sinais são perdidos, recomendamos que deixe de usar o Cloud Profiler. A utilização contínua pode causar a perda de números de sinais e entradas excessivas no registo de erros.
Todos os perfis em falta
Existem dois motivos comuns pelos quais pode não ver perfis:
- O serviço não está em execução durante tempo suficiente para recolher perfis.
- O serviço não está configurado para autenticação.
Para resolver problemas relacionados com um tempo de execução curto, certifique-se de que o seu serviço é executado continuamente durante, pelo menos, 3 minutos.
Para resolver problemas relacionados com a autenticação, certifique-se de que o agente de criação de perfis consegue escrever dados no seu Google Cloud projeto:
Se o seu serviço estiver a ser executado no Google Cloud, a autenticação é automática, exceto quando implementa um contentor no Compute Engine. Quando implementa um contentor no Compute Engine, tem de especificar o Google Cloud ID do projeto no comando do agente do Profiler
start
. Para ver instruções, consulte a secção Associar o agente a um Google Cloud projeto.Se o seu serviço estiver a ser executado fora do Google Cloud, tem de criar uma conta de serviço e associar o agente do Profiler ao seu projeto doGoogle Cloud . Para mais informações, consulte o artigo Criar perfis de aplicações em execução fora do Google Cloud.
Perfis em falta de um tipo específico
Esta secção apresenta configurações específicas em que os perfis de um ou mais tipos de perfis não são recolhidos. A primeira secção contém conteúdo geral e as restantes secções listam problemas para idiomas específicos.
Informações gerais
Se quiser ver um tipo de perfil específico, mas não estiverem disponíveis perfis desse tipo, verifique o seguinte:
Certifique-se de que o tipo de perfil é suportado para o idioma da sua aplicação. Para mais informações, consulte o artigo Tipos de criação de perfis disponíveis.
Certifique-se de que usou uma nova versão do serviço depois de alterar os tipos de perfis recolhidos. Se não especificar uma nova versão do serviço, é usada uma implementação existente e o agente de criação de perfis não pode transferir os dados para o tipo de perfil recém-ativado. Para mais informações sobre as implementações, consulte o artigo Recolha de perfis.
Certifique-se de que o tipo de perfil está ativado. Alguns tipos de perfis estão desativados por predefinição. Para mais informações, consulte as páginas de idiomas individuais:
As restantes secções desta página descrevem configurações específicas do idioma em que os dados de um tipo de perfil não são recolhidos.
Go: os perfis de tempo da CPU não são recolhidos para c-archives
Quando uma aplicação Go é criada com a flag -buildmode
definida como c-archive
ou c-shared
, a criação de perfis de tempo da CPU é desativada por predefinição. São recolhidos perfis de memória, contenção e threads.
Para mais informações, consulte o
problema do GitHub n.º 993: o criador de perfis não recolhe dados da CPU para código Go num arquivo c.
Para resolver este problema,
ative a recolha de perfis de tempo da CPU antes das chamadas de serviço
profiler.Start
e adicione uma chamada a
signal.Notify(make(chan os.Signal), syscall.SIGPROF)
.
Para mais informações sobre a funcionalidade signal.Notify
, consulte
func Notify
.
Java: os perfis de memória não são recolhidos quando existem vários analisadores ativados
Ativou vários criadores de perfis de memória para uma aplicação Java e não tem perfis.
O exemplo de heap Java está ativado como uma capacidade de agente autónoma. O efeito é que só pode usar um criador de perfis de cada vez. Foi aberto um erro para estender o Java de modo a suportar vários analisadores de perfil de memória. Para obter informações sobre esse erro, consulte o artigo Adicione suporte multiagente para o mecanismo de amostragem de memória.
Para resolver este problema, ative um criador de perfis.
Python: sem tempo de CPU e sem perfis de tempo real quando usa o uWSGI
Quando o
uWSGI
usa vários trabalhadores para processar pedidos, o comportamento
predefinido é realizar a inicialização da aplicação apenas no processo
principal (master
). Os processos ramificados não executam a sequência de inicialização.
Se configurar o agente de criação de perfis na sequência de inicialização da sua aplicação, por exemplo, configurar o agente de criação de perfis no método AppConfig.ready()
de uma aplicação Django, o agente de criação de perfis não é configurado para os processos ramificados.
Para resolver este problema,
execute a inicialização da aplicação em todos os processos de trabalho definindo a flag
lazy-apps
como true
.
Python: tem perfis de tempo da CPU, mas não tem perfis de tempo real quando usa o uWSGI
O Wall profiler depende do módulo de sinal do Python. Quando o intérprete Python é compilado com suporte de threads, a configuração predefinida desativa o processamento de sinais personalizado para processos bifurcados.
Para resolver este problema,
para aplicações uWSGI, ative o processamento de sinais personalizado definindo a flag
py-call-osafterfork
como true
.
Python: sem perfis para processos ramificados
Os agentes de criação de perfis só podem criar perfis do processo que iniciou o agente.
Para resolver este problema, se a sua aplicação ramificar processos e quiser recolher perfis dos processos ramificados, inicialize o agente após a ramificação.