Uso della memoria nelle applicazioni di alto livello
Importante
Questa è la documentazione di Azure Sphere (legacy). Azure Sphere (legacy) viene ritirato il 27 settembre 2027 e gli utenti devono eseguire la migrazione ad Azure Sphere (integrato) entro questo periodo. Usare il selettore di versione posizionato sopra il sommario per visualizzare la documentazione di Azure Sphere (integrata).
Questo argomento fornisce informazioni dettagliate sull'uso della memoria nelle applicazioni di alto livello. Per informazioni sulla quantità di memoria disponibile per le applicazioni con funzionalità in tempo reale (RTApps), vedere Considerazioni sulla gestione di memoria e latenza.
Le applicazioni di alto livello hanno accesso alla memoria e allo spazio di archiviazione seguenti:
- 256 KiB di RAM nel core di alto livello, riservato interamente per l'uso di applicazioni di alto livello. Fino a 1 KiB di questo spazio può essere allocato per ogni canale di buffer condiviso attraverso cui le applicazioni di alto livello comunicano con le applicazioni RTApps.
- 1 MiB di memoria flash di sola lettura, condivisa tra i core di alto livello e in tempo reale.
- Spazio di archiviazione (modificabile) in lettura/scrittura, persistente al riavvio dei dispositivi. Per informazioni sullo spazio di archiviazione modificabile, vedere Uso dell'archiviazione in Azure Sphere.
Nota
L'aggiornamento ripetuto del flash alla fine lo indossa e lo rende non valido. Pertanto, è necessario progettare il codice per evitare aggiornamenti non necessari del flash. Ad esempio, se si desidera salvare lo stato dell'applicazione prima di uscire in modo da poter ripristinare lo stato salvato dopo un riavvio, è consigliabile salvare lo stato dell'applicazione nel flash solo se lo stato è cambiato.
Determinare l'uso della memoria flash
Per determinare l'utilizzo della memoria flash, prendere in considerazione solo le dimensioni del file del pacchetto immagine 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 di runtime e le librerie condivise 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 dei componenti che abilitano il failover o il rollback in caso di danneggiamento o problemi con gli aggiornamenti over-the-air.
Durante lo sviluppo e il debug, tuttavia, le dimensioni del debugger non vengono conteggiate rispetto al limite. Il debugger viene automaticamente aggiunto da azsphere device enable-development e rimosso da azsphere device enable-cloud-test. È possibile trovare le dimensioni del debugger usato dall'SDK cercando gdbserver.imagepackage nella cartella DebugTools della directory di installazione di Microsoft Azure Sphere SDK.
Il comando azsphere device sideload restituisce un errore se il pacchetto dell'immagine dell'applicazione e il debugger (se presente) superano il limite totale di 1 MiB. Il comando azsphere image add --image che carica una nuova immagine nel tenant di Azure Sphere restituisce anche un errore se il pacchetto immagine supera 1 MiB.
Il limite di 256 KiB di RAM si applica solo all'applicazione; non è necessario consentire la RAM usata dal debugger. La memoria aggiuntiva è riservata alle allocazioni del kernel.
Il flash disponibile e la RAM possono aumentare (ma non ridurranno mai) per le applicazioni scritte per il chip Azure Sphere corrente (MT3620). In futuro, i chip di Azure Sphere potranno avere limiti diversi.
Condizioni di memoria insufficiente
Se l'applicazione usa una quantità eccessiva di RAM, il sistema operativo Azure Sphere la termina con un segnale SIGKILL. Nel debugger, ad esempio, verrà visualizzato quanto segue:
Child terminated with signal = 0x9 (SIGKILL)
Il segnale SIGKILL si verifica anche se un'applicazione di alto livello non viene chiusa dopo che riceve 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, vedere Procedure consigliate per la gestione dell'utilizzo della RAM nelle 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 kibibytes. Si tratta dell'utilizzo totale della memoria fisica dell'app nel sistema, incluse le allocazioni del kernel (ad esempio buffer per i socket) per conto dell'app o del server di debug, restituite come valore non elaborato (in KiB).
- Applications_GetUserModeMemoryUsageInKB: ottenere l'utilizzo della memoria in modalità utente in kibibyte. Questa è la quantità di memoria fisica usata direttamente dall'app, la memoria usata da qualsiasi libreria per suo conto (detta anche allocazioni anon ) e la memoria usata dal server di debug, restituita come valore non elaborato (in KiB).
- Applications_GetPeakUserModeMemoryUsageInKB: ottenere il picco di utilizzo della memoria in modalità utente in kibibytes. Si tratta della quantità massima di memoria utente usata nella sessione corrente. Quando si testa l'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 ridistribuisce. Usare questa funzione per ottenere un'analisi approssimativa della vicinanza dell'applicazione al limite consigliato di 256 KiB.
Per usare queste funzioni nell'applicazione di alto livello, includere il file di intestazione applications.h. È possibile usare queste funzioni durante lo sviluppo per ottenere 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 rilevamento e pulizia dell'overuse della memoria illustra come rilevare e gestire normalmente l'utilizzo imprevisto della memoria.
Nota
Queste funzioni restituiscono l'utilizzo della memoria come illustrato dal sistema operativo. Attualmente, la liberazione della memoria da parte di un'applicazione per le allocazioni nell'heap utente non viene segnalata da queste funzioni. La memoria verrà restituita alla libreria malloc per un uso futuro, ma le statistiche segnalate dal sistema operativo rimangono invariate a meno che la memoria non sia stata allocata e liberata dal sistema operativo stesso. Un esempio è l'allocazione della memoria per un socket. Pertanto, queste funzioni sono utili per comprendere gli scenari peggiori per consentire all'applicazione di operare in modo conservativo per garantire la massima affidabilità. I valori sono approssimativi e possono variare in base alle versioni del sistema operativo.
Aggiungere il rilevamento dell'allocazione di memoria heap
È possibile ottenere informazioni aggiuntive sull'utilizzo della memoria aggiungendo il rilevamento dell'allocazione di memoria heap, che mostra quali allocazioni utente e kernel vengono eseguite 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 in modo più efficace. Questa funzionalità, disponibile con il sistema operativo Azure Sphere versione 21.07 o successiva e la versione del runtime dell'applicazione (ARV) 10 o versione successiva, funziona solo in un dispositivo abilitato per lo sviluppo e solo quando l'applicazione non è in esecuzione nel debugger.
Nota
Per il corretto funzionamento del rilevamento dell'allocazione di memoria heap, è necessario completare entrambe le attività di configurazione descritte in questa sezione. In caso contrario, non verrà visualizzato un avviso durante la compilazione e le informazioni sulla memoria dell'heap.
Per abilitare il rilevamento dell'allocazione di memoria heap, è necessario eseguire due operazioni:
Aggiungere la funzionalità HeapMemStats al file di app-manifest.json dell'applicazione:
"Capabilities": { "HeapMemStats": true },
Aggiungere la libreria libmalloc al pacchetto immagine aggiungendo
DEBUG_LIB "libmalloc"
alazsphere_target_add_image
comando nel file CMakeLists.txt dell'applicazione:azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
Importante
Poiché il rilevamento dell'allocazione di memoria heap funziona solo nei dispositivi abilitati per lo sviluppo, è necessario eseguire le operazioni seguenti per rimuoverlo dall'applicazione prima di compilare pacchetti di immagine per la distribuzione:
- Eliminare la riga "HeapMemStats": true" dal file di app-manifest.json dell'applicazione.
- Rimuovere
DEBUG_LIB "libmalloc"
dalazsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc"
comando nel file di CMakeLists.txt dell'applicazione.
Usare il profiler prestazioni di Visual Studio
Se si usa Visual Studio, è possibile usare la funzionalità del profiler prestazioni per ottenere informazioni sull'utilizzo della memoria dell'applicazione. Per un'esercitazione che usa questo profiler, vedere Tutorials/MemoryUsage.
Prerequisiti
- Un kit di sviluppo di Azure Sphere connesso al PC che esegue Visual Studio con Azure Sphere SDK installato. Vedere Installare Azure Sphere SDK per Windows.
- Un dispositivo preparato per lo sviluppo. Vedere azsphere device enable-development. Il profiler prestazioni non restituirà i dati se il dispositivo non è abilitato per lo sviluppo.
Avviare il profiler di utilizzo della memoria
Selezionare Debug>Performance Profiler oppure premere ALT+F2 per aprire la finestra di avvio del profiler prestazioni.
In Destinazione analisi, se Il profiler del dispositivo Azure Sphere non è visibile, selezionare Scegli destinazione e selezionare Azure Sphere Device Profiler.
In Strumenti disponibili verificare che l'utilizzo della memoria di Azure Sphere sia selezionato, quindi selezionare Avvia per aprire la finestra di profilatura dell'utilizzo della memoria e avviare il profiler di memoria.
Se è necessario distribuire o riavviare l'applicazione, selezionare Avvia debug>senza eseguire 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 eseguire il debug](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). L'esecuzione dell'app nel debugger comporterà l'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
Nella finestra di profilatura dell'utilizzo della memoria viene visualizzata una visualizzazione simile alla seguente:
Al centro della visualizzazione, un grafico di 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: utilizzo totale della memoria fisica dell'app nel sistema, incluse le allocazioni del kernel (ad esempio buffer per i socket) per conto dell'app o del server di debug.
- Utente: la quantità di memoria fisica usata direttamente dall'app, la memoria usata da qualsiasi libreria per suo conto (detta anche allocazioni anon ) e la memoria usata dal server di debug.
- Picco utente: quantità massima di memoria utente usata nella sessione corrente. Quando si testa l'utilizzo della memoria dell'applicazione, è necessario assicurarsi che questo valore non superi mai 256 KiB. La memoria aggiuntiva è riservata alle allocazioni del kernel. Questo valore viene reimpostato ogni volta che l'app viene riavviata o ridistribuisce.
Il grafico traccia anche le occorrenze dell'evento New Peak (rappresentato da un triangolo). Questo evento si verifica ogni volta che è presente un nuovo valore massimo per l'utilizzo della memoria utente di picco. L'evento è abilitato per l'accessibilità dell'utilità per la lettura dello schermo.
Se è stato abilitato il rilevamento dell'allocazione di memoria heap e l'applicazione non è in esecuzione nel debugger, verrà visualizzato un grafico aggiuntivo che mostra le statistiche di memoria heap:
- Heap totale: 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.
Sopra i grafici, una visualizzazione sequenza temporale visualizza 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 vista tabella visualizza le stesse statistiche ed eventi di memoria.
Suggerimento
Per copiare dati dalla tabella negli Appunti, premere CTRL+A per selezionare tutte le righe e quindi premere CTRL+C.
I primi due grafici illustrati in questa sezione sono stati acquisiti durante l'esecuzione della fase 1 dell'esercitazione sull'utilizzo della memoria, che contiene una perdita di memoria. L'utilizzo della memoria sale in modo monotonico in ogni grafico, fornendo prove visive per la perdita. Quando la perdita è fissa, come nella fase 2 dell'esercitazione sull'utilizzo della memoria, il grafico aumenta e cade man mano che la memoria viene allocata e deallocata.
Visualizzare le statistiche sull'utilizzo totale della memoria
Il comando azsphere device app show-memory-stats restituisce statistiche sull'utilizzo totale della memoria, sull'utilizzo della modalità utente e sul picco di utilizzo in modalità utente per le applicazioni in esecuzione in un dispositivo collegato. Il dispositivo deve avere la funzionalità del dispositivo appDevelopment configurata per eseguire questo comando.
Le statistiche di utilizzo della RAM visualizzate durante l'esecuzione dell'app sono:
- Totale (kernel e modalità utente): 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.
- Modalità utente: la quantità di memoria fisica usata direttamente dall'app, la memoria usata da qualsiasi libreria per suo conto (denominata anche allocazioni anon ) e la memoria usata dal server di debug.
- Modalità utente di picco: quantità massima di memoria utente usata nella sessione corrente. Quando si testa l'utilizzo della memoria dell'applicazione, è necessario assicurarsi che questo valore non superi mai 256 KiB. La memoria aggiuntiva è riservata alle allocazioni del kernel. Questo valore viene reimpostato ogni volta che l'app viene riavviata o ridistribuisce.
Se è stato abilitato il rilevamento dell'allocazione di memoria heap e l'applicazione non è in esecuzione nel debugger, verranno visualizzate righe aggiuntive di statistiche di memoria heap:
- Heap: app e librerie statiche: le allocazioni del kernel e dell'utente dal codice e da tutte le librerie collegate in modo statico.
- Heap: <allocazioni di librerie dinamiche: 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 gli script per eseguire il comando azsphere device app show-memory-stats in un ciclo come descritto negli esempi seguenti:
Prompt dei comandi di Windows
Usando il Blocco note o un altro editor di testo, creare un file di script batch memuse.bat con il contenuto seguente:
@echo off
:loop
call azsphere 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 Y al prompt "Termina processo batch?".
Windows PowerShell
while ($true) {
azsphere device app show-memory-stats
Start-Sleep -Seconds 1
}
Utilizzo della memoria e debugger
Quando si esegue l'app nel debugger, le statistiche di memoria segnalate includono anche l'utilizzo della memoria del processo del server di debug e altri utilizzi di memoria aggiuntivi causati dal debug, ad esempio l'impostazione di 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 righe di codice durante l'osservazione di modifiche relative all'utilizzo della memoria possono essere una tecnica utile per identificare le cause dei picchi di utilizzo della memoria o delle perdite di memoria.
Quando si esegue il debug in Visual Studio, il profiler prestazioni viene aperto automaticamente, ma non visualizza il rilevamento dell'allocazione della memoria heap.