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:

  1. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. 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 como start se estiver a ser executado fora do Google Cloud. Para mais informações, consulte a função start.

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 para signal.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:

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.