Compartilhar via


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

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

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

  • 256 RAM kib no núcleo de alto nível, reservada 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.
  • 1 Memória flash somente leitura do MiB, que é compartilhada entre os núcleos de alto nível e em tempo real.
  • Armazenamento de leitura/gravação (mutável), que persiste quando um dispositivo é reiniciado. Para obter informações sobre o armazenamento mutável, consulte Usando o armazenamento no Azure Sphere.

Nota

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 de memória flash, considere apenas o tamanho do arquivo de pacote de imagem que inclui os metadados de imagem, o manifesto do aplicativo e a imagem executável. Você não precisa considerar o armazenamento exigido por componentes fornecidos pela Microsoft, como o sistema operacional 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 habilitam failover ou reversão em caso de corrupção ou problemas com atualizações no ar.

Durante o desenvolvimento e a depuração, no entanto, o tamanho do depurador conta contra o limite. O depurador é adicionado automaticamente pelo az sphere device enable-development e removido por [dispositivo az sphere enable-cloud-test](.. /reference/az sphere-device.md). Você pode encontrar o tamanho do depurador usado pelo SDK procurando gdbserver.imagepackage na pasta DebugTools do diretório de instalação do SDK do Microsoft Azure Sphere.

O comando de sideload do dispositivo az sphere retorna um erro se o pacote de imagem do aplicativo e o depurador (se presente) excederem o limite total de 1 MiB. O comando az sphere image add --image que carrega uma nova imagem no catálogo do Azure Sphere também retorna um erro se o pacote de imagem exceder 1 MiB.

O limite de RAM do KiB 256 se aplica apenas ao aplicativo; você não precisa permitir a RAM usada pelo depurador. A 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). Os futuros chips do Azure Sphere podem ter limites diferentes.

Condições fora da 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 ocorrerá se um aplicativo de alto nível não sair depois de 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 fora da memória, confira as melhores práticas 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 no runtime. Você pode usá-los para monitorar o uso de memória do aplicativo de alto nível, permitindo que você reinicie seu aplicativo com segurança se o uso de 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, retornados 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 quaisquer bibliotecas em seu nome (também conhecidas como alocações de anon ) e 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 seu aplicativo é reiniciado ou reimplantado. Use essa função para obter uma visão aproximada de quão perto seu aplicativo está chegando ao 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 aplicativo, mas também pode usá-las junto com o log para capturar informações de dispositivos no campo. O snippet detecção e limpeza de uso excessivo de memória demonstra como detectar e lidar com o uso de memória inesperado.

Nota

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 de 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 maneira conservadora para obter a confiabilidade máxima. Os valores são aproximados e podem variar entre as versões do sistema operacional.

Adicionar rastreamento de alocação de memória de heap

Você pode obter informações adicionais de uso de memória adicionando o rastreamento de alocação de memória de 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 de forma mais eficaz. Esse recurso, disponível com o Azure Sphere OS versão 21.07 ou posterior e a versão de runtime do aplicativo (ARV) 10 ou posterior, funciona apenas em um dispositivo habilitado para desenvolvimento e somente quando o aplicativo não está em execução sob o depurador.

Nota

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

Para habilitar o rastreamento de alocação de memória de 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 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 rastreamento de alocação de memória do 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 Tutoriais/MemoryUsage.

Pré-requisitos

  • Um kit de desenvolvimento do Azure Sphere conectado ao computador que executa 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 az sphere 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>Perfil de Desempenho ou pressione Alt+F2 para abrir a janela de início do criador de perfil de desempenho.

    Janela do criador de perfil de desempenho do Visual Studio

  2. Em Destino de Análise, se o Criador de Perfis de Dispositivo do Azure Sphere não estiver visível, selecione Escolher Destino e selecione Perfil de Dispositivo do Azure Sphere.

  3. Em Ferramentas Disponíveis, verifique se o Uso de Memória do Azure Sphere está verificado e, em seguida, 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>Iniciar 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 sob o depurador resultará em uso inflado de RAM, 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 do modo de 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 ao KiB mais próximo) como três linhas diferentes enquanto seu aplicativo está em execução:

  • Total: 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 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 quaisquer bibliotecas em seu nome (também conhecidas como alocações anon ) 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. A memória adicional é reservada para alocações de kernel. Esse valor é redefinido sempre que seu aplicativo é reiniciado ou reimplantado.

O grafo também plota ocorrências do evento New Peak (representado por um triângulo). Esse evento ocorre sempre que há um novo máximo para o uso máximo de memória do usuário. 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 sob o depurador, você 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 do seu aplicativo, inclusive 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 heap do Visual Studio

Acima dos grafos, uma exibição linha do tempo exibe o tempo de execução do aplicativo, correlacionado com os dados no grafo abaixo. Use Zoom In e Zoom Out para se concentrar em períodos específicos de tempo.

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

Ponta

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

Os dois primeiros grafos mostrados nesta seção foram feitos durante a execução do Estágio 1 do tutorial Uso da Memória, que contém um vazamento de memória. O uso de memória sobe monotonicamente em cada grafo, 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 cai à medida que a memória é alocada e desalocada.

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

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

O comando az sphere device app show-memory-stats retorna estatísticas de uso de memória sobre o uso total da memória, o uso do modo de usuário e o uso máximo 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 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 quaisquer bibliotecas em seu nome (também conhecidas como alocações de anon ) e 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. A memória adicional é reservada para alocações de kernel. Esse valor é redefinido sempre que seu 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 sob o depurador, você verá linhas adicionais de estatísticas de memória heap:

  • Heap: App + Bibliotecas Estáticas: as alocações de kernel e usuário do código e de todas as bibliotecas estaticamente vinculadas a ele.
  • Heap: <alocações> de biblioteca dinâmica: alocações de bibliotecas vinculadas dinamicamente individuais 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 [az sphere device app show-memory-stats](.. Comando /reference/az sphere-device.md) em um loop, conforme descrito nos seguintes exemplos:

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 az sphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop

Execute o script do lote digitando seu nome no prompt de comando (ou no caminho completo para o arquivo, se ele 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 Prompt de Comando e responda a Y para o prompt "Encerrar trabalho em lote?".

Windows PowerShell

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

Uso de memória e o depurador

Ao executar seu aplicativo sob o depurador, as estatísticas de memória relatadas também incluem o uso de memória do processo de depuração do servidor e outro uso adicional de memória causado pela depuração, como a configuração de pontos de interrupção. Por esse motivo, você sempre deve 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 ao observar 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 Profiler de Desempenho é aberto automaticamente, mas não exibe o rastreamento de alocação de memória de heap.