Uso della memoria in applicazioni di alto livello

Questo argomento fornisce informazioni dettagliate sull'uso della memoria in applicazioni di alto livello. Vedere Considerazioni sulla gestione della memoria e della latenza per informazioni sulla memoria disponibile per le applicazioni in tempo reale (RTApps).

Le applicazioni di alto livello hanno accesso alla memoria e all'archiviazione seguenti:

  • 256 KiB RAM nel core di alto livello, riservato interamente per l'utilizzo di applicazioni di alto livello. Fino a 1 KiB di questo spazio può essere allocato per ogni canale di buffer condiviso attraverso il quale le applicazioni di alto livello e RTApp comunicano.
  • 1 Memoria flash di sola lettura MiB, che viene condivisa tra i core di alto livello e in tempo reale.
  • Memoria di lettura/scrittura (modificabile), che persiste al riavvio di un dispositivo. Per informazioni sull'archiviazione modificabile, vedi Uso dello spazio di archiviazione in Azure Sphere.

Nota

Aggiornando ripetutamente il flash, alla fine lo consuma e lo rende non valido. Pertanto, è consigliabile progettare il codice per evitare aggiornamenti non necessari del flash. Ad esempio, se si vuole salvare lo stato dell'applicazione prima di uscire in modo da poter recuperare lo stato salvato dopo un riavvio, è consigliabile salvare lo stato dell'applicazione in modalità flash solo se lo stato è cambiato.

Determinare l'utilizzo della memoria flash

Per determinare l'utilizzo della memoria flash, considerare solo le dimensioni del file del pacchetto di immagini che include i metadati dell'immagine, il manifesto dell'applicazione e l'immagine eseguibile. Non è necessario tenere conto dello spazio di archiviazione richiesto dai componenti forniti da Microsoft, ad esempio il sistema operativo Azure Sphere o i servizi e le librerie condivise di runtime che controllano le periferiche e abilitano la connessione a un hub IoT di Azure. Analogamente, non è necessario includere le dimensioni di una copia di backup completa dell'applicazione o i componenti che consentono il failover o il rollback in caso di danneggiamento o problemi con gli aggiornamenti in modalità over-the-air.

Durante lo sviluppo e il debug, tuttavia, le dimensioni del debugger vengono conteggiate rispetto al limite. Il debugger viene aggiunto automaticamente da az sphere device enable-development e rimosso da [az sphere device enable-cloud-test](.. /reference/az sphere-device.md). È possibile trovare le dimensioni del debugger utilizzato dall'SDK cercando gdbserver.imagepackage nella cartella DebugTools della directory di installazione di Microsoft Azure Sphere SDK.

Il comando sideload del dispositivo az sphere restituisce un errore se il pacchetto di immagini dell'applicazione e il debugger (se presente) superano il limite totale di 1 MiB. Il comando az sphere image add --image che carica una nuova immagine nel catalogo di Azure Sphere restituisce anche un errore se il pacchetto dell'immagine supera 1 MiB.

Il limite di 256 KiB RAM si applica solo all'applicazione; non è necessario consentire la RAM utilizzata dal debugger. Memoria aggiuntiva riservata per le allocazioni del kernel.

Il flash e la RAM disponibili possono aumentare (ma non diminuiranno mai) per le applicazioni scritte per l'attuale chip Azure Sphere (MT3620). I chip futuri di Azure Sphere possono avere limiti diversi.

Condizioni di memoria esaurite

Se l'applicazione utilizza troppa RAM, il sistema operativo Azure Sphere la termina con un segnale SIGKILL. Ad esempio, nel debugger verrà visualizzato quanto segue:

Child terminated with signal = 0x9 (SIGKILL)

Il segnale SIGKILL si verifica anche se un'applicazione di alto livello non riesce a uscire dopo aver ricevuto la richiesta SIGTERM. Per informazioni dettagliate, vedere Ciclo di vita di un'applicazione .

Per evitare arresti anomali nell'applicazione a causa di una condizione di memoria insufficiente, vedi le procedure consigliate per la gestione dell'utilizzo della RAM in applicazioni di alto livello.

Determinare l'utilizzo della RAM dell'applicazione in fase di esecuzione

Azure Sphere offre diverse funzioni per ottenere informazioni sull'utilizzo della memoria in fase di esecuzione. È possibile usarli per monitorare l'utilizzo della memoria dell'applicazione di alto livello, consentendo di riavviare l'applicazione in modo sicuro se l'utilizzo della memoria supera una soglia specificata entro il limite di 256 KiB. Le funzioni disponibili sono:

  • Applications_GetTotalMemoryUsageInKB: ottenere l'utilizzo totale della memoria in kibibyte. Si tratta dell'utilizzo totale della memoria fisica dell'app nel sistema, incluse le allocazioni del kernel (ad esempio i buffer per i socket) per conto dell'app o del server di debug, restituite come valore RAW (in KiB).
  • Applications_GetUserModeMemoryUsageInKB: ottenere l'utilizzo della memoria in modalità utente in kibibyte. Si tratta della quantità di memoria fisica utilizzata direttamente dall'app, della memoria utilizzata da qualsiasi libreria per suo conto (definita anche allocazioni anon ) e della memoria utilizzata dal server di debug, restituita come valore RAW (in KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: ottenere il picco dell'utilizzo della memoria in modalità utente in kibibyte. Si tratta della quantità massima di memoria utente utilizzata nella sessione corrente. Durante il test dell'utilizzo della memoria dell'applicazione, è necessario assicurarsi che questo valore non superi mai 256 KiB. Questo valore viene reimpostato ogni volta che l'app viene riavviata o ridistribuita. Usare questa funzione per ottenere uno sguardo approssimativo su quanto vicino l'applicazione sta ottenendo il limite di 256 KiB consigliato.

Per usare queste funzioni nell'applicazione di alto livello, includere il file di intestazione applications.h. È possibile usare queste funzioni durante lo sviluppo per farsi un'idea dell'uso complessivo della memoria dell'applicazione, ma è anche possibile usarle insieme alla registrazione per acquisire informazioni dai dispositivi nel campo. Il frammento di snippet Rilevamento sovrautilizzo memoria e Pulizia mostra come rilevare e gestire correttamente l'utilizzo imprevisto della memoria.

Nota

Queste funzioni restituiscono l'utilizzo della memoria visto dal sistema operativo. Attualmente, il liberatore di memoria da un'applicazione per le allocazioni sull'heap utente non è riportato da queste funzioni. La memoria verrà restituita alla libreria malloc per un uso futuro, ma le statistiche riportate dal sistema operativo rimangono invariate a meno che la memoria non sia stata allocata e liberata dal sistema operativo stesso. Un esempio potrebbe essere l'allocazione della memoria per un socket. Pertanto, queste funzioni sono utili per comprendere scenari relativi al caso peggiore per aiutare l'applicazione operare in modo conservativo per la massima affidabilità. I valori sono approssimativi e possono variare in base alle versioni del sistema operativo.

Aggiungere il rilevamento dell'allocazione della memoria heap

È possibile ottenere ulteriori informazioni sull'utilizzo della memoria aggiungendo il monitoraggio dell'allocazione della memoria heap, che mostra quali allocazioni di utenti e kernel vengono effettuate da librerie statiche e collegate dinamicamente. In questo modo viene fornita un'immagine più completa della posizione in cui la memoria viene usata dall'applicazione per usarla nel modo più efficace. Questa funzionalità, disponibile con il sistema operativo Azure Sphere versione 21.07 o successiva e con la versione di runtime dell'applicazione (ARV) 10 o successiva, funziona solo in un dispositivo abilitato allo sviluppo e solo quando l'applicazione non è in esecuzione nel debugger.

Nota

È necessario completare entrambe le attività di configurazione descritte in questa sezione per il corretto funzionamento del rilevamento dell'allocazione della memoria heap. In caso contrario, verrà segnalato un avviso durante la compilazione e le informazioni sulla memoria heap non verranno visualizzate.

Per abilitare il monitoraggio dell'allocazione della memoria heap, è necessario eseguire due operazioni:

  • Aggiungere la funzionalità HeapMemStats al file app-manifest.json dell'applicazione:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Aggiungere la libreria libmalloc al pacchetto di immagini aggiungendo DEBUG_LIB "libmalloc" al azsphere_target_add_image comando nel file di CMakeLists.txt dell'applicazione:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Importante

Poiché il monitoraggio dell'allocazione della memoria heap funziona solo su dispositivi abilitati allo sviluppo, è consigliabile eseguire le operazioni seguenti per rimuoverlo dall'applicazione prima di creare pacchetti immagine per la distribuzione:

  • Elimina la riga '"HeapMemStats": true' dal file app-manifest.json dell'applicazione.
  • Rimuovi DEBUG_LIB "libmalloc" dal azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" comando nel file di CMakeLists.txt dell'applicazione.

Usare il profiler delle prestazioni di Visual Studio

Se si utilizza Visual Studio, è possibile utilizzare la funzionalità profiler delle prestazioni per ottenere informazioni sull'utilizzo della memoria dell'applicazione. Per un'esercitazione che usa questo profiler, vedere Esercitazioni/MemoryUsage.

Prerequisiti

Avviare il profiler di utilizzo della memoria

  1. Seleziona Debug>Performance Profiler o premi ALT+F2 per aprire la finestra di avvio del profiler delle prestazioni.

    Finestra Profilo prestazioni di Visual Studio

  2. In Bersaglio di analisi, se il Profilo dispositivo Azure Sphere non è visibile, seleziona Scegli bersaglio e seleziona Azure Sphere Device Profiler.

  3. In Strumenti disponibili, verifica che l'uso della memoria Azure Sphere sia selezionato, quindi seleziona Avvia per aprire la finestra di profilatura dell'utilizzo della memoria e avviare il profiler della memoria.

  4. Se è necessario distribuire o riavviare l'applicazione, selezionare Avvia debug>senza debug o premere CTRL+F5 per distribuire l'applicazione nel dispositivo.

    Importante

    Per ottenere informazioni accurate sull'utilizzo della RAM per l'applicazione, è importante [avviare l'app senza debug](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging). L'esecuzione dell'app sotto il debugger determinerà un aumento dell'utilizzo della RAM, perché la memoria utilizzata dal server di debug verrà inclusa nelle statistiche di utilizzo della RAM segnalate.

Interpretazione dei dati del profiler di utilizzo della memoria

La finestra di profilatura utilizzo memoria mostra una visualizzazione simile alla seguente:

Finestra del profiler utilizzo memoria di Visual Studio

Al centro della vista, un grafico memoria fisica del dispositivo Azure Sphere traccia tre diverse statistiche di utilizzo della RAM (mostrate al KiB più vicino) come tre righe diverse mentre l'app è in esecuzione:

  • Totale: L'utilizzo totale della memoria fisica dell'app nel sistema, incluse le allocazioni del kernel (ad esempio i buffer per i socket) per conto dell'app o del server di debug.
  • Utente: La quantità di memoria fisica utilizzata direttamente dall'app, la memoria utilizzata da tutte le librerie per suo conto (dette anche allocazioni anon ) e la memoria utilizzata dal server di debug.
  • Utente di punta: La quantità massima di memoria utente utilizzata nella sessione corrente. Durante il test dell'utilizzo della memoria dell'applicazione, è necessario assicurarsi che questo valore non superi mai 256 KiB. Memoria aggiuntiva riservata per le allocazioni del kernel. Questo valore viene reimpostato ogni volta che l'app viene riavviata o ridistribuita.

Il grafico traccia anche le occorrenze dell'evento Nuovo picco (rappresentato da un triangolo). Questo evento si verifica ogni volta che è presente un nuovo valore massimo per l'utilizzo della memoria dell'utente di picco. L'evento è abilitato per l'accessibilità dell'utilità per la lettura dello schermo.

Se è stato abilitato il monitoraggio dell'allocazione della memoria heap e l'applicazione non è in esecuzione nel debugger, verrà visualizzato un grafico aggiuntivo che mostra le statistiche della memoria heap:

  • Heap totale: la memoria heap totale allocata da o per conto dell'applicazione, incluse le librerie statiche e dinamiche.
  • Heap libreria condivisa: allocazioni da librerie collegate dinamicamente fornite dal sistema operativo Azure Sphere.

Utilizzo della memoria heap di Visual Studio

Sopra i grafici, una visualizzazione sequenza temporale mostra il tempo di esecuzione dell'app, correlato ai dati nel grafico seguente. Usare Zoom avanti e Zoom indietro per concentrarsi su periodi di tempo specifici.

Sotto i grafici, una visualizzazione tabella mostra le stesse statistiche e gli stessi eventi di memoria.

Mancia

Per copiare i dati dalla tabella negli Appunti, premere CTRL+A per selezionare tutte le righe, quindi premere CTRL+C.

I primi due grafici mostrati in questa sezione sono stati presi durante l'esecuzione fase 1 del tutorial utilizzo memoria, che contiene una perdita di memoria. L'uso della memoria sale monotonamente in ogni grafico, fornendo prove visive per la perdita. Quando la perdita è stata risolta, come nella fase 2 del tutorial sull'utilizzo della memoria, il grafico aumenta e scende quando la memoria viene allocata e deallocata.

Utilizzo della memoria heap di Visual Studio senza perdita di memoria

Visualizzare le statistiche sull'utilizzo totale della memoria

Il comando show-memory-stats dell'app del dispositivo az sphere restituisce statistiche sull'utilizzo totale della memoria, l'utilizzo della modalità utente e il picco dell'utilizzo in modalità utente per le applicazioni in esecuzione su un dispositivo collegato. Il dispositivo deve avere la funzionalità appSviluppo del dispositivo configurata per eseguire questo comando.

Le statistiche di utilizzo della RAM visualizzate mentre l'app è in esecuzione sono:

  • Totale (kernel + modalità utente): l'utilizzo totale della memoria fisica dell'app nel sistema, incluse le allocazioni del kernel (ad esempio buffer per socket) per conto dell'app o del server di debug.
  • Modalità utente: la quantità di memoria fisica utilizzata direttamente dall'app, la memoria utilizzata da qualsiasi libreria per suo conto (definita anche allocazioni anon ) e la memoria utilizzata dal server di debug.
  • Modalità utente picco: la quantità massima di memoria utente usata nella sessione corrente. Durante il test dell'utilizzo della memoria dell'applicazione, è necessario assicurarsi che questo valore non superi mai 256 KiB. Memoria aggiuntiva riservata per le allocazioni del kernel. Questo valore viene reimpostato ogni volta che l'app viene riavviata o ridistribuita.

Se è stato abilitato il monitoraggio dell'allocazione della memoria heap e l'applicazione non è in esecuzione nel debugger, verranno visualizzate ulteriori righe di statistiche di memoria heap:

  • Heap: App + Librerie statiche: allocazioni kernel e utente dal codice e da qualsiasi libreria collegata staticamente ad esso.
  • Heap: <allocazioni> di libreria dinamica: allocazioni da singole librerie collegate dinamicamente fornite dal sistema operativo Azure Sphere.

Monitoraggio continuo dell'utilizzo della memoria

Per monitorare l'utilizzo della memoria nel tempo, è possibile usare script per eseguire [az sphere device app show-memory-stats](.. /reference/az sphere-device.md) in un ciclo come descritto negli esempi seguenti:

Prompt dei comandi di Windows

Usando blocco note o un altro editor di testo, creare un file script batch memuse.bat con il contenuto seguente:

@echo off

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

Eseguire lo script batch digitandone il nome al prompt dei comandi (o il percorso completo del file, se non si trova nella directory corrente):

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
 -------------------------- -------------

Per uscire dallo script, digitare CTRL+C nella finestra del prompt dei comandi , quindi rispondere A al prompt "Termina processo batch?".

Windows PowerShell

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

Utilizzo della memoria e debugger

Durante l'esecuzione dell'app nel debugger, le statistiche sulla memoria segnalate includono anche l'utilizzo della memoria del processo del server di debug e altri utilizzi aggiuntivi della memoria causati dal debug, ad esempio l'impostazione dei punti di interruzione. Per questo motivo, è consigliabile eseguire sempre l'app senza eseguire il debug quando si tenta di raccogliere statistiche di memoria accurate.

Tuttavia, l'uso del profiler di utilizzo della memoria può essere utile se si esegue l'app con il debugger. L'impostazione di punti di interruzione e l'esecuzione di istruzioni nelle righe di codice osservando le modifiche relative nel consumo di memoria può essere una tecnica utile per identificare le cause dei picchi di utilizzo della memoria o delle perdite di memoria.

Durante il debug in Visual Studio, il Performance Profiler si apre automaticamente, ma non visualizza il rilevamento dell'allocazione della memoria heap.