Partilhar via


Utilização da memória em aplicações de alto nível

Este tópico fornece detalhes sobre a utilização da memória em aplicações de alto nível. Veja Gerir considerações de memória e latência para obter informações sobre a memória disponível para aplicações com capacidade em tempo real (RTApps).

As aplicações de alto nível têm acesso à seguinte memória e armazenamento:

  • 256 KiB RAM no núcleo de alto nível, reservada inteiramente para utilização de aplicações de alto nível. Pode ser alocado até 1 KiB deste espaço para cada canal de memória intermédia partilhado através do qual as aplicações de alto nível e o RTApps comunicam.
  • 1 Memória flash só de leitura miB, que é partilhada entre os núcleos de alto nível e em tempo real.
  • Armazenamento de leitura/escrita (mutável), que persiste quando um dispositivo é reiniciado. Para obter informações sobre o armazenamento mutável, veja Utilizar o armazenamento no Azure Sphere.

Nota

Atualizar repetidamente o flash eventualmente desgasta-o e torna-o inválido. Por conseguinte, deve estruturar o código para evitar atualizações desnecessárias do flash. Por exemplo, se quiser guardar o estado da aplicação antes de sair para poder recuperar o estado guardado após um reinício, considere guardar o estado da aplicação no flash apenas se o estado tiver sido alterado.

Determinar a utilização da memória flash

Para determinar a utilização da memória flash, considere apenas o tamanho do ficheiro de pacote de imagem que inclui os metadados da imagem, o manifesto da aplicação e a imagem executável. Não precisa de ter em conta o armazenamento exigido pelos componentes fornecidos pela Microsoft, como o SO do Azure Sphere ou os serviços de tempo de execução e bibliotecas partilhadas que controlam os periféricos e permitem a ligação a um Hub IoT do Azure. Da mesma forma, não precisa de incluir o tamanho de uma cópia de segurança completa da sua aplicação ou os componentes que permitem a ativação pós-falha ou reversão em caso de danos ou problemas com atualizações via rede aérea.

No entanto, durante o desenvolvimento e a depuração, o tamanho do depurador é contabilizado em relação ao limite. O depurador é adicionado automaticamente pelo az sphere device enable-development e removido por [az sphere device enable-cloud-test](.. /reference/az sphere-device.md). Pode encontrar o tamanho do depurador utilizado pelo SDK ao procurar gdbserver.imagepackage na pasta DebugTools do diretório de instalação do SDK do Microsoft Azure Sphere.

O comando az sphere device sideload devolve um erro se o pacote de imagem da aplicação e o depurador (se estiverem) excederem o limite total de 1 MiB. O comando az sphere image add --image , que carrega uma nova imagem para o catálogo do Azure Sphere, também devolve um erro se o pacote de imagem exceder 1 MiB.

O limite de RAM de 256 KiB aplica-se apenas à aplicação; não precisa de permitir a RAM utilizada pelo depurador. A memória adicional está reservada para alocações de kernel.

O flash e a RAM disponíveis podem aumentar (mas nunca diminuirão) para aplicações escritas para o chip atual do Azure Sphere (MT3620). Os futuros chips do Azure Sphere podem ter limites diferentes.

Condições de falta de memória

Se a sua aplicação utilizar demasiada RAM, o SO do Azure Sphere termina-a com um sinal SIGKILL. Por exemplo, no depurador, verá o seguinte:

Child terminated with signal = 0x9 (SIGKILL)

O sinal SIGKILL também ocorre se uma aplicação de alto nível não sair depois de receber o pedido SIGTERM. Veja Ciclo de vida de uma aplicação para obter detalhes.

Para ajudar a evitar falhas na sua aplicação devido a uma condição de memória insuficiente, veja melhores práticas para gerir a utilização de RAM em aplicações de alto nível.

Determinar a utilização da RAM da aplicação em tempo de execução

O Azure Sphere fornece várias funções para obter informações de utilização da memória no runtime. Pode utilizá-las para monitorizar a utilização de memória da sua aplicação de alto nível, permitindo-lhe reiniciar a aplicação em segurança se a utilização da memória exceder um limiar especificado dentro do limite de 256 KiB. As funções disponíveis são:

  • Applications_GetTotalMemoryUsageInKB: obtenha a utilização total da memória em kibibytes. Esta é a utilização total da memória física da sua aplicação no sistema, incluindo alocações de kernel (como memórias intermédias para sockets) em nome da sua aplicação ou do servidor de depuração, devolvido como um valor não processado (no KiB).
  • Applications_GetUserModeMemoryUsageInKB: obtenha a utilização da memória no modo de utilizador em kibibytes. Esta é a quantidade de memória física utilizada diretamente pela sua aplicação, a memória utilizada por quaisquer bibliotecas em seu nome (também referidas como alocações anon ) e a memória utilizada pelo servidor de depuração, devolvida como um valor não processado (em KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: obtenha o pico de utilização da memória do modo de utilizador em kibibytes. Esta é a quantidade máxima de memória de utilizador utilizada na sessão atual. Ao testar a utilização da memória da sua aplicação, deve garantir que este valor nunca excede 256 KiB. Este valor é reposto sempre que a aplicação é reiniciada ou é reimplementada. Utilize esta função para obter uma visão aproximada da proximidade da sua aplicação até ao limite recomendado de 256 KiB.

Para utilizar estas funções na sua aplicação de alto nível, inclua o ficheiro de cabeçalho applications.h. Pode utilizar estas funções durante o desenvolvimento para ter uma ideia da utilização geral da memória da sua aplicação, mas também pode utilizá-las juntamente com o registo para capturar informações de dispositivos no campo. O fragmento Deteção e Limpeza de Utilização Geral da Memória demonstra como detetar e lidar corretamente com a utilização inesperada da memória.

Nota

Estas funções devolvem a utilização da memória, conforme visto pelo SO. Atualmente, a libertação de memória por uma aplicação para alocações na área dinâmica para dados do utilizador não é reportada por estas funções. A memória será devolvida à biblioteca malloc para utilização futura, mas as estatísticas comunicadas pelo SO permanecem inalteradas, a menos que a memória tenha sido alocada e libertada pelo próprio SO. Um exemplo seria a alocar memória para um socket. Por conseguinte, estas funções são úteis para compreender os piores cenários para ajudar a sua aplicação a funcionar de forma conservadora para obter a máxima fiabilidade. Os valores são aproximados e podem variar entre versões do SO.

Adicionar controlo de alocação de memória dinâmica para dados

Pode obter informações adicionais sobre a utilização da memória ao adicionar o controlo de alocação de memória de área dinâmica, que mostra as alocações de utilizador e kernel que estão a ser feitas por bibliotecas estáticas e ligadas dinamicamente. Isto fornece uma imagem mais completa de onde a memória está a ser utilizada pela sua aplicação para o ajudar a utilizá-la de forma mais eficaz. Esta funcionalidade, disponível com a versão 21.07 ou posterior do SO do Azure Sphere e a versão de runtime da aplicação (ARV) 10 ou posterior, só funciona num dispositivo compatível com desenvolvimento e apenas quando a aplicação não está em execução no depurador.

Nota

Tem de concluir ambas as tarefas de configuração descritas nesta secção para que o controlo de alocação de memória dinâmica para dados funcione corretamente. Se não o fizer, será comunicado um aviso durante a compilação e as informações da memória da área dinâmica para dados não serão apresentadas.

Para ativar o controlo da alocação de memória dinâmica para dados, tem de efetuar duas ações:

  • Adicione a capacidade HeapMemStats ao ficheiro app-manifest.json da sua aplicação:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Adicione a biblioteca libmalloc ao pacote de imagens ao adicionar DEBUG_LIB "libmalloc" ao azsphere_target_add_image comando no ficheiro de CMakeLists.txt da sua aplicação:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Importante

Uma vez que o controlo da alocação de memória dinâmica para dados só funciona em dispositivos preparados para desenvolvimento, deve fazer o seguinte para removê-lo da sua aplicação antes de criar pacotes de imagens para implementação:

  • Elimine a linha "HeapMemStats": true" do ficheiro app-manifest.json da sua aplicação.
  • Remova DEBUG_LIB "libmalloc" do azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" comando no ficheiro de CMakeLists.txt da sua aplicação.

Utilizar o gerador de perfis de desempenho do Visual Studio

Se utilizar o Visual Studio, pode utilizar a respetiva funcionalidade de gerador de perfis de desempenho para obter informações sobre a utilização da memória da aplicação. Para um tutorial que utiliza este gerador de perfis, veja Tutorials/MemoryUsage.

Pré-requisitos

Iniciar o gerador de perfis de utilização de memória

  1. Selecione Depurar>o Gerador de Perfis de Desempenho ou prima Alt+F2 para abrir a janela de início do gerador de perfis de desempenho.

    Janela do gerador de perfis de desempenho do Visual Studio

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

  3. Em Ferramentas Disponíveis, certifique-se de que a Utilização da Memória do Azure Sphere está selecionada e, em seguida, selecione Iniciar para abrir a janela de criação de perfis de utilização da memória e iniciar o gerador de perfis de memória.

  4. Se precisar de implementar ou reiniciar a aplicação, selecione Depurar>Iniciar Sem Depuração ou prima Ctrl+F5 para implementar a aplicação no dispositivo.

    Importante

    Para obter informações precisas de utilização de RAM para a sua aplicação, é importante que [inicie a sua aplicação sem depuração](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging). A execução da aplicação no depurador resultará numa utilização de RAM inflacionada, uma vez que a memória consumida pelo servidor de depuração será incluída nas estatísticas de utilização da RAM comunicadas.

Interpretar os dados do gerador de perfis de utilização de memória

A janela de criação de perfis de utilização da memória apresenta uma vista semelhante à seguinte:

Janela do gerador de perfis de utilização de memória do Visual Studio

No centro da vista, um gráfico de Memória Física do Dispositivo do Azure Sphere desenha três estatísticas de utilização de RAM diferentes (mostradas ao KiB mais próximo) como três linhas diferentes enquanto a sua aplicação está em execução:

  • Total: A utilização total da memória física da sua aplicação no sistema, incluindo alocações de kernel (como memórias intermédias para sockets) em nome da sua aplicação ou do servidor de depuração.
  • Utilizador: A quantidade de memória física utilizada diretamente pela sua aplicação, a memória utilizada por quaisquer bibliotecas em seu nome (também referidas como alocações anon ) e a memória utilizada pelo servidor de depuração.
  • Utilizador de Pico: A quantidade máxima de memória de utilizador utilizada na sessão atual. Ao testar a utilização da memória da sua aplicação, deve garantir que este valor nunca excede 256 KiB. A memória adicional está reservada para alocações de kernel. Este valor é reposto sempre que a aplicação é reiniciada ou é reimplementada.

O gráfico também desenha ocorrências do evento New Peak (representado por um triângulo). Este evento ocorre sempre que existe um novo máximo para a utilização da memória do Utilizador Máximo. O evento está ativado para acessibilidade do leitor de ecrã.

Se tiver ativado o controlo de alocação de memória dinâmica para dados e a aplicação não estiver em execução no depurador, verá um gráfico adicional a mostrar estatísticas de memória de área dinâmica para dados:

  • Total Heap: a memória de área dinâmica para dados total alocada por ou em nome da sua aplicação, incluindo a partir de bibliotecas estáticas e dinâmicas.
  • Área Dinâmica da Biblioteca Partilhada: alocações de bibliotecas ligadas dinamicamente fornecidas pelo SO do Azure Sphere.

Utilização da memória de área dinâmica para dados do Visual Studio

Acima dos gráficos, uma vista de linha cronológica apresenta o tempo de execução da sua aplicação, correlacionado com os dados no gráfico abaixo. Utilize Ampliar e Reduzir para se concentrar em períodos de tempo específicos.

Por baixo dos gráficos, uma vista de tabela apresenta as mesmas estatísticas e eventos de memória.

Sugestão

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

Os dois primeiros gráficos apresentados nesta secção foram criados durante a execução da Fase 1 do tutorial Utilização da Memória, que contém uma fuga de memória. A utilização da memória sobe monotonicamente em cada gráfico, fornecendo provas visuais para a fuga. Quando a fuga é corrigida, como na Fase 2 do tutorial Utilização da Memória, o gráfico sobe e cai à medida que a memória é alocada e desalocada.

Utilização da memória de área dinâmica para dados do Visual Studio sem fuga de memória

Ver estatísticas sobre a utilização total da memória

O comando az sphere device app show-memory-stats devolve estatísticas de utilização da memória sobre a utilização total da memória, a utilização do modo de utilizador e a utilização máxima do modo de utilizador para aplicações em execução num dispositivo anexado. O dispositivo tem de ter a capacidade de dispositivo appDevelopment configurada para executar este comando.

As estatísticas de utilização da RAM apresentadas enquanto a aplicação está em execução são:

  • Total (Kernel + Modo de Utilizador): a utilização total da memória física da sua aplicação no sistema, incluindo alocações de kernel (como memórias intermédias para sockets) em nome da sua aplicação ou do servidor de depuração.
  • Modo de Utilizador: a quantidade de memória física utilizada diretamente pela sua aplicação, a memória utilizada por quaisquer bibliotecas em seu nome (também referidas como alocações anon ) e a memória utilizada pelo servidor de depuração.
  • Modo de Utilizador máximo: a quantidade máxima de memória de utilizador utilizada na sessão atual. Ao testar a utilização da memória da sua aplicação, deve garantir que este valor nunca excede 256 KiB. A memória adicional está reservada para alocações de kernel. Este valor é reposto sempre que a aplicação é reiniciada ou é reimplementada.

Se tiver ativado o controlo da alocação de memória dinâmica para dados e a aplicação não estiver em execução no depurador, verá linhas adicionais de estatísticas de memória de área dinâmica para dados:

  • Área dinâmica para dados: Aplicação + Bibliotecas Estáticas: o kernel e as alocações de utilizador do seu código e quaisquer bibliotecas estaticamente ligadas ao mesmo.
  • Área dinâmica: <alocações> de biblioteca dinâmica: alocações de bibliotecas ligadas dinamicamente individuais fornecidas pelo SO do Azure Sphere.

Monitorização contínua da utilização da memória

Para monitorizar a utilização da memória ao longo do tempo, pode utilizar scripts para executar [az sphere device app show-memory-stats](.. Comando /reference/az sphere-device.md) num ciclo, conforme descrito nos seguintes exemplos:

Linha de Comandos do Windows

Com o Bloco de Notas ou outro editor de texto, crie um ficheiro de script de 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 de lote ao escrever o respetivo nome na linha de comandos (ou o caminho completo para o ficheiro, 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, escreva Ctrl+C na janela linha de comandos e, em seguida, responda Y ao pedido "Terminar tarefa de lote?".

Windows PowerShell

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

Utilização da memória e o depurador

Ao executar a aplicação no depurador, as estatísticas de memória comunicadas também incluem a utilização da memória do processo de depuração do servidor e outra utilização adicional da memória causada pela depuração, como a definição de pontos de interrupção. Por este motivo, deve sempre executar a sua aplicação sem depuração ao tentar recolher estatísticas de memória precisas.

No entanto, utilizar o gerador de perfis de utilização de memória pode ser útil se executar a sua aplicação 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 dos picos de utilização da memória ou fugas de memória.

Ao depurar no Visual Studio, o Gerador de Perfis de Desempenho é aberto automaticamente, mas não apresenta o controlo de alocação de memória dinâmica para dados.