Compartilhar via


Uso de memória em aplicativos de alto nível

Importante

Esta é a documentação do Azure Sphere (herdado). O Azure Sphere (herdado) será desativado em 27 de setembro de 2027 e os usuários devem migrar para o Azure Sphere (integrado) até esse momento. Use o seletor de versão localizado acima do sumário para exibir a documentação do Azure Sphere (Integrado).

Este tópico fornece detalhes sobre o uso de memória em aplicativos de alto nível. Confira Gerenciar memória e considerações de latência para saber mais sobre a memória disponível para RTApps (aplicativos com capacidade para tempo real).

Aplicativos de alto nível têm acesso à memória e ao armazenamento a seguir:

  • 256 KiB RAM no núcleo de alto nível, reservado inteiramente para uso de aplicativo de alto nível. Até 1 KiB desse espaço pode ser alocado para cada canal de buffer compartilhado por meio do qual aplicativos de alto nível e RTApps se comunicam.
  • Memória flash somente leitura de 1 MiB, que é habilitada entre núcleos de alto nível e em tempo real.
  • Armazenamento de leitura/gravação (mutável), que persiste quando um dispositivo é reinicializado. Para obter informações sobre o armazenamento mutável, confira Uso do armazenamento no Azure Sphere.

Observação

Atualizar repetidamente o flash eventualmente o desgasta e o torna inválido. Portanto, você deve projetar seu código para evitar atualizações desnecessárias do flash. Por exemplo, se você quiser salvar o estado do aplicativo antes de sair para que possa recuperar o estado salvo após uma reinicialização, considere salvar o estado do aplicativo no flash somente se o estado tiver sido alterado.

Determinar o uso de memória flash

Para determinar o uso da memória flash, considere apenas o tamanho do arquivo do pacote de imagens que inclui os metadados da imagem, o manifesto do aplicativo e a imagem executável. Você não precisa considerar o armazenamento exigido pelos componentes fornecidos pela Microsoft, como o sistema operacional do Azure Sphere ou os serviços de tempo de execução e bibliotecas compartilhadas que controlam periféricos e habilitam a conexão com um Hub IoT do Azure. Da mesma forma, você não precisa incluir o tamanho de uma cópia de backup completa do seu aplicativo ou os componentes que permitem failover ou reversão em caso de corrupção ou problemas com atualizações over-the-air.

No entanto, durante o desenvolvimento e a depuração, o tamanho do depurador é levado em conta no limite. O depurador é adicionado automaticamente pelo azsphere device enable-development e removido pelo azsphere device enable-cloud-test. Você pode encontrar o tamanho do depurador usado pelo SDK pesquisando gdbserver.imagepackage na pasta DebugTools do diretório de instalação do SDK do Microsoft Azure Sphere.

O comando azsphere device sideload retornará um erro se o pacote de imagem do aplicativo e o depurador (se presente) excederem o limite total de 1 MiB. O comando azsphere image add --image , que carrega uma nova imagem para o locatário do Azure Sphere, também retornará um erro se o pacote de imagens exceder 1 MiB.

O limite de 256 KiB de RAM se aplica apenas ao aplicativo; você não precisa permitir a RAM usada pelo depurador. Memória adicional é reservada para alocações de kernel.

O flash e a RAM disponíveis podem aumentar (mas nunca diminuirão) para aplicativos gravados para o chip atual do Azure Sphere (MT3620). Chips futuros do Azure Sphere podem ter limites diferentes.

Fora de condições de memória

Se o aplicativo usar muita RAM, o sistema operacional do Azure Sphere o encerrará com um sinal SIGKILL. Por exemplo, no depurador você verá o seguinte:

Child terminated with signal = 0x9 (SIGKILL)

O sinal SIGKILL também ocorre se um aplicativo de alto nível não for encerrado após receber a solicitação SIGTERM. Consulte Ciclo de vida de um aplicativo para obter detalhes.

Para ajudar a evitar falhas em seu aplicativo devido à condição de falta de memória, consulte as práticas recomendadas para gerenciar o uso de RAM em aplicativos de alto nível.

Determinar o uso de RAM do aplicativo em tempo de execução

O Azure Sphere fornece várias funções para obter informações de uso de memória em runtime. Você pode usá-los para monitorar o uso de memória do aplicativo de alto nível, permitindo que você reinicie o aplicativo com segurança se o uso da memória exceder um limite especificado dentro do limite de 256 KiB. As funções disponíveis são:

  • Applications_GetTotalMemoryUsageInKB: Obtenha o uso total de memória em kibibytes. Esse é o uso total de memória física do seu aplicativo no sistema, incluindo alocações de kernel (como buffers para soquetes) em nome do seu aplicativo ou do servidor de depuração, retornado como um valor bruto (em KiB).
  • Applications_GetUserModeMemoryUsageInKB: Obtenha o uso de memória do modo de usuário em kibibytes. Essa é a quantidade de memória física usada diretamente pelo aplicativo, a memória usada por qualquer biblioteca em seu nome (também conhecida como alocações anônimas ) e a memória usada pelo servidor de depuração, retornada como um valor bruto (em KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Obtenha o pico de uso de memória do modo de usuário em kibibytes. Essa é a quantidade máxima de memória do usuário usada na sessão atual. Ao testar o uso de memória do seu aplicativo, você deve garantir que esse valor nunca exceda 256 KiB. Esse valor é redefinido sempre que o aplicativo é reiniciado ou reimplantado. Use esta função para obter uma visão aproximada de quão perto seu aplicativo está chegando do limite recomendado de 256 KiB.

Para usar essas funções em seu aplicativo de alto nível, inclua o arquivo de cabeçalho applications.h. Você pode usar essas funções durante o desenvolvimento para ter uma ideia do uso geral da memória do seu aplicativo, mas também pode usá-las junto com o registro em log para capturar informações de dispositivos em campo. O snippet de Detecção e Limpeza de Uso Excessivo de Memória demonstra como detectar e lidar normalmente com o uso inesperado de memória.

Observação

Essas funções retornam o uso de memória conforme visto pelo sistema operacional. Atualmente, a liberação de memória por um aplicativo para alocações no heap do usuário não é relatada por essas funções. A memória será retornada à biblioteca malloc para uso futuro, mas as estatísticas relatadas pelo sistema operacional permanecem inalteradas, a menos que a memória tenha sido alocada e liberada pelo próprio sistema operacional. Um exemplo seria alocar memória para um soquete. Portanto, essas funções são úteis para entender os piores cenários para ajudar seu aplicativo a operar de forma conservadora para máxima confiabilidade. Os valores são aproximados e podem variar entre as versões do sistema operacional.

Adicionar um acompanhamento de alocação de memória heap

Você pode obter informações adicionais de uso de memória adicionando o rastreamento de alocação de memória heap, que mostra quais alocações de usuário e kernel estão sendo feitas por bibliotecas estáticas e vinculadas dinamicamente. Isso fornece uma imagem mais completa de onde a memória está sendo usada pelo seu aplicativo para ajudá-lo a usá-la com mais eficiência. Esse recurso, disponível com o sistema operacional do Azure Sphere versão 21.07 ou posterior e a versão de tempo de execução do aplicativo (ARV) 10 ou posterior, funciona somente em um dispositivo habilitado para desenvolvimento e somente quando o aplicativo não está em execução no depurador.

Observação

Você deve concluir as duas tarefas de configuração descritas nesta seção para que o rastreamento de alocação de memória heap funcione corretamente. Se você não fizer isso, um aviso será relatado durante a compilação e as informações de memória heap não serão exibidas.

Para habilitar o rastreamento de alocação de memória heap, você precisa fazer duas coisas:

  • Adicione o recurso HeapMemStats ao arquivo app-manifest.json do aplicativo:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Adicione a biblioteca libmalloc ao seu pacote de imagens adicionando DEBUG_LIB "libmalloc" ao azsphere_target_add_image comando no arquivo CMakeLists.txt do aplicativo:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Importante

Como o acompanhamento de alocação de memória de heap funciona apenas em dispositivos habilitados para desenvolvimento, você deve fazer o seguinte para removê-lo do aplicativo antes de criar pacotes de imagem para implantação:

  • Exclua a linha '"HeapMemStats": true' do arquivo app-manifest.json do aplicativo.
  • Remova DEBUG_LIB "libmalloc" do azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" comando no arquivo CMakeLists.txt do aplicativo.

Usar o criador de perfil de desempenho do Visual Studio

Se você usar o Visual Studio, poderá usar seu recurso de criador de perfil de desempenho para obter informações sobre o uso da memória do aplicativo. Para obter um tutorial que usa esse criador de perfil, consulte Tutorials/MemoryUsage.

Pré-requisitos

  • Um kit de desenvolvimento do Azure Sphere conectado ao seu computador executando o Visual Studio com o SDK do Azure Sphere instalado. Consulte Instalar o SDK do Azure Sphere para Windows.
  • Um dispositivo preparado para desenvolvimento. Consulte azsphere device enable-development. O criador de perfil de desempenho não retornará dados se o dispositivo não estiver habilitado para desenvolvimento.

Iniciar o criador de perfil de uso de memória

  1. Selecione Depurar>Criador de Perfil de Desempenho ou pressione Alt+F2 para abrir a janela inicial do criador de perfil de desempenho.

    Janela do criador de perfil de desempenho do Visual Studio

  2. Em Destino de Análise, se o Azure Sphere Device Profiler não estiver visível, selecione Escolher Destino e selecione Azure Sphere Device Profiler.

  3. Em Ferramentas Disponíveis, verifique se o Uso de Memória do Azure Sphere está marcado e selecione Iniciar para abrir a janela de criação de perfil de uso de memória e iniciar o criador de perfil de memória.

  4. Se você precisar implantar ou reiniciar seu aplicativo, selecione Depurar>Início Sem Depuração ou pressione Ctrl+F5 para implantar seu aplicativo no dispositivo.

    Importante

    Para obter informações precisas de uso de RAM para seu aplicativo, é importante que você [inicie seu aplicativo sem depuração](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). Executar seu aplicativo no depurador resultará em uso de RAM inflado, pois a memória consumida pelo servidor de depuração será incluída nas estatísticas de uso de RAM relatadas.

Interpretando os dados do criador de perfil de uso de memória

A janela de criação de perfil de uso de memória exibe uma exibição como a seguinte:

Janela do criador de perfil de uso de memória do Visual Studio

No centro da exibição, um grafo de Memória Física do Dispositivo do Azure Sphere plota três estatísticas de uso de RAM diferentes (mostradas para o KiB mais próximo) como três linhas diferentes enquanto seu aplicativo está em execução:

  • Total: o uso total da memória física do seu aplicativo no sistema, incluindo alocações de kernel (como buffers para soquetes) em nome do seu aplicativo ou do servidor de depuração.
  • Usuário: a quantidade de memória física usada diretamente pelo aplicativo, a memória usada por qualquer biblioteca em seu nome (também conhecida como alocações anônimas ) e a memória usada pelo servidor de depuração.
  • Usuário de pico: a quantidade máxima de memória do usuário usada na sessão atual. Ao testar o uso de memória do seu aplicativo, você deve garantir que esse valor nunca exceda 256 KiB. Memória adicional é reservada para alocações de kernel. Esse valor é redefinido sempre que o aplicativo é reiniciado ou reimplantado.

O gráfico também representa as ocorrências do evento Novo Pico (representado por um triângulo). Esse evento ocorre sempre que há um novo máximo para o uso de memória do usuário de pico. O evento está habilitado para acessibilidade do leitor de tela.

Se você tiver habilitado o rastreamento de alocação de memória heap e seu aplicativo não estiver em execução no depurador, verá um gráfico adicional mostrando estatísticas de memória heap:

  • Heap total: a memória de heap total alocada por ou em nome de seu aplicativo, incluindo de bibliotecas estáticas e dinâmicas.
  • Heap de Biblioteca Compartilhada: alocações de bibliotecas vinculadas dinamicamente fornecidas pelo sistema operacional do Azure Sphere.

Uso de memória de heap do Visual Studio

Acima dos gráficos, uma visualização de linha do tempo exibe o tempo de execução do seu aplicativo, correlacionado com os dados no gráfico abaixo. Use Mais zoom e Menos zoom para focar em períodos de tempo específicos.

Abaixo dos gráficos, uma exibição de tabela exibe as mesmas estatísticas e eventos de memória.

Dica

Para copiar dados da tabela para a área de transferência, pressione Ctrl+A para selecionar todas as linhas e, em seguida, pressione Ctrl+C.

Os dois primeiros gráficos mostrados nesta seção foram obtidos durante a execução do Estágio 1 do tutorial Uso de memória, que contém um vazamento de memória. O uso de memória sobe monotonicamente em cada gráfico, fornecendo evidências visuais para o vazamento. Quando o vazamento é corrigido, como no Estágio 2 do tutorial Uso de Memória, o gráfico sobe e desce à medida que a memória é alocada e desalocada.

Uso de memória de heap do Visual Studio sem vazamento de memória

Exibir estatísticas sobre o uso total de memória

O comando azsphere device app show-memory-stats retorna estatísticas de uso de memória sobre o uso total de memória, o uso do modo de usuário e o pico de uso do modo de usuário para aplicativos em execução em um dispositivo anexado. O dispositivo deve ter a funcionalidade do dispositivo appDevelopment configurada para executar esse comando.

As estatísticas de uso de RAM exibidas enquanto seu aplicativo está em execução são:

  • Total (Kernel + Modo de Usuário): o uso total de memória física do seu aplicativo no sistema, incluindo alocações de kernel (como buffers para soquetes) em nome do seu aplicativo ou do servidor de depuração.
  • Modo de usuário: a quantidade de memória física usada diretamente pelo aplicativo, a memória usada por qualquer biblioteca em seu nome (também conhecida como alocações anônimas ) e a memória usada pelo servidor de depuração.
  • Modo de usuário de pico: a quantidade máxima de memória do usuário usada na sessão atual. Ao testar o uso de memória do seu aplicativo, você deve garantir que esse valor nunca exceda 256 KiB. Memória adicional é reservada para alocações de kernel. Esse valor é redefinido sempre que o aplicativo é reiniciado ou reimplantado.

Se você tiver habilitado o rastreamento de alocação de memória heap e seu aplicativo não estiver em execução no depurador, verá linhas adicionais de estatísticas de memória heap:

  • Heap: Aplicativo + Bibliotecas Estáticas: as alocações de kernel e usuário do seu código e de todas as bibliotecas vinculadas estaticamente a ele.
  • Heap: <alocações> de biblioteca dinâmica: alocações de bibliotecas individuais vinculadas dinamicamente fornecidas pelo sistema operacional do Azure Sphere.

Monitoramento contínuo do uso de memória

Para monitorar o uso de memória ao longo do tempo, você pode usar scripts para executar o comando azsphere device app show-memory-stats em um loop, conforme descrito nos exemplos a seguir:

Prompt de Comando do Windows

Usando o Bloco de Notas ou outro editor de texto, crie um arquivo de script em lote memuse.bat com o seguinte conteúdo:

@echo off

:loop
call azsphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop

Execute o script em lote digitando seu nome no prompt de comando (ou o caminho completo para o arquivo, se não estiver no diretório atual):

C:\Users\username> memuse.bat
 -------------------------- -------------
 Name                       Usage (bytes)
 ========================================
 Total (Kernel + User Mode) 65536
 -------------------------- -------------
 User Mode                  36864
 -------------------------- -------------
 Peak User Mode             36864
 -------------------------- -------------
 -------------------------- -------------
 Name                       Usage (bytes)
 ========================================
 Total (Kernel + User Mode) 65536
 -------------------------- -------------
 User Mode                  36864
 -------------------------- -------------
 Peak User Mode             36864
 -------------------------- -------------

Para sair do script, digite Ctrl+C na janela do Prompt de Comando e responda Y ao prompt "Encerrar trabalho em lote?".

Windows PowerShell

while ($true) {
    azsphere device app show-memory-stats
    Start-Sleep -Seconds 1
}

Uso de memória e o depurador

Ao executar seu aplicativo no depurador, as estatísticas de memória relatadas também incluem o uso de memória do processo do servidor de depuração e outros usos de memória adicionais causados pela depuração, como a configuração de pontos de interrupção. Por esse motivo, você deve sempre executar seu aplicativo sem depuração ao tentar coletar estatísticas de memória precisas.

No entanto, usar o criador de perfil de uso de memória pode ser útil se você executar seu aplicativo com o depurador. Definir pontos de interrupção e percorrer linhas de código enquanto observa alterações relativas no consumo de memória pode ser uma técnica útil para identificar as causas de picos de uso de memória ou vazamentos de memória.

Ao depurar no Visual Studio, o Performance Profiler é aberto automaticamente, mas não exibe o acompanhamento de alocação de memória de heap.