Delen via


Geheugengebruik in toepassingen op hoog niveau

Belangrijk

Dit is de Documentatie voor Azure Sphere (verouderd). Azure Sphere (verouderd) wordt op 27 september 2027 buiten gebruik gesteld en gebruikers moeten tegen deze tijd migreren naar Azure Sphere (geïntegreerd). Gebruik de versiekiezer boven de inhoudsweergave om de Documentatie van Azure Sphere (geïntegreerd) weer te geven.

Dit onderwerp bevat informatie over geheugengebruik in toepassingen op hoog niveau. Zie Aandachtspunten voor geheugen en latentie beheren voor informatie over het beschikbare geheugen voor realtime toepassingen (RTApps).

Toepassingen op hoog niveau hebben toegang tot het volgende geheugen en de volgende opslag:

  • 256 KiB RAM op de kern op hoog niveau, volledig gereserveerd voor toepassingsgebruik op hoog niveau. Maximaal 1 KiB van deze ruimte kan worden toegewezen voor elk gedeeld bufferkanaal waarmee toepassingen op hoog niveau en RTApps communiceren.
  • 1 MiB alleen-lezen flashgeheugen, dat wordt gedeeld tussen de kernen op hoog niveau en realtime.
  • Lees-/schrijfopslag (onveranderbaar) blijft behouden wanneer een apparaat opnieuw wordt opgestart. Zie Opslag op Azure Sphere gebruiken voor meer informatie over onveranderbare opslag.

Notitie

Herhaaldelijk bijwerken van de flash draagt deze uiteindelijk uit en maakt het ongeldig. Daarom moet u uw code ontwerpen om onnodige updates van de flash te voorkomen. Als u bijvoorbeeld de status van uw toepassing wilt opslaan voordat u afsluit, zodat u de opgeslagen status kunt herstellen na een herstart, kunt u overwegen om de status van de toepassing alleen op de flash op te slaan als de status is gewijzigd.

Flashgeheugengebruik bepalen

Als u het flashgeheugengebruik wilt bepalen, moet u alleen rekening houden met de grootte van het installatiekopieënpakketbestand dat de metagegevens van de afbeelding, het toepassingsmanifest en de uitvoerbare installatiekopieën bevat. U hoeft geen rekening te houden met de opslag die is vereist door door Microsoft geleverde onderdelen, zoals het Azure Sphere-besturingssysteem of de runtimeservices en gedeelde bibliotheken die randapparatuur beheren en verbinding met een Azure IoT Hub inschakelen. Op dezelfde manier hoeft u niet de grootte van een volledige back-upkopie van uw toepassing of de onderdelen op te nemen die failover of terugdraaien in geval van beschadiging of problemen met over-the-air-updates mogelijk maken.

Tijdens de ontwikkeling en foutopsporing telt de grootte van het foutopsporingsprogramma echter wel mee aan de limiet. Het foutopsporingsprogramma wordt automatisch toegevoegd door azsphere device enable-development en verwijderd door azsphere device enable-cloud-test. U vindt de grootte van het foutopsporingsprogramma dat door uw SDK wordt gebruikt door te zoeken naar gdbserver.imagepackage in de map DebugTools van de installatiemap van de Microsoft Azure Sphere SDK.

De opdracht azsphere device sideload retourneert een fout als het installatiekopieënpakket van de toepassing en het foutopsporingsprogramma (indien aanwezig) de totale limiet van 1 MiB overschrijden. De opdracht azsphere image add --image waarmee een nieuwe installatiekopieën worden geüpload naar uw Azure Sphere-tenant, retourneert ook een fout als het installatiekopieënpakket groter is dan 1 MiB.

De 256 KiB RAM-limiet is alleen van toepassing op de toepassing; u hoeft geen RAM-geheugen toe te staan dat wordt gebruikt door het foutopsporingsprogramma. Extra geheugen is gereserveerd voor kerneltoewijzingen.

De beschikbare flash en RAM kunnen toenemen (maar zullen nooit afnemen) voor toepassingen die zijn geschreven voor de huidige Azure Sphere-chip (MT3620). Toekomstige Azure Sphere-chips kunnen verschillende limieten hebben.

Onvoldoende geheugen

Als uw toepassing te veel RAM gebruikt, beëindigt het Azure Sphere-besturingssysteem het met een SIGKILL-signaal. In het foutopsporingsprogramma ziet u bijvoorbeeld het volgende:

Child terminated with signal = 0x9 (SIGKILL)

Het SIGKILL-signaal treedt ook op als een toepassing op hoog niveau niet kan worden afgesloten nadat deze de SIGTERM-aanvraag heeft ontvangen. Zie de levenscyclus van een toepassing voor meer informatie.

Zie de aanbevolen procedures voor het beheren van RAM-gebruik in toepassingen op hoog niveau om crashes in uw toepassing te voorkomen vanwege onvoldoende geheugen.

Ram-gebruik van runtimetoepassingen bepalen

Azure Sphere biedt verschillende functies voor het verkrijgen van informatie over geheugengebruik tijdens runtime. U kunt deze gebruiken om het geheugengebruik van uw toepassing op hoog niveau te bewaken, zodat u uw toepassing veilig opnieuw kunt starten als het geheugengebruik een drempelwaarde overschrijdt die u opgeeft binnen de limiet van 256 KiB. De beschikbare functies zijn:

  • Applications_GetTotalMemoryUsageInKB: het totale geheugengebruik in kibibytes ophalen. Dit is het totale fysieke geheugengebruik van uw app op het systeem, inclusief kerneltoewijzingen (zoals buffers voor sockets) namens uw app of de foutopsporingsserver, geretourneerd als onbewerkte waarde (in KiB).
  • Applications_GetUserModeMemoryUsageInKB: het geheugengebruik van de gebruikersmodus ophalen in kibibytes. Dit is de hoeveelheid fysiek geheugen dat rechtstreeks door uw app wordt gebruikt, het geheugen dat door bibliotheken wordt gebruikt (ook wel anontoewijzingen genoemd) en het geheugen dat door de foutopsporingsserver wordt gebruikt, geretourneerd als een onbewerkte waarde (in KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Het geheugengebruik in de piekgebruikersmodus ophalen in kibibytes. Dit is de maximale hoeveelheid gebruikersgeheugen die wordt gebruikt in de huidige sessie. Wanneer u het geheugengebruik van uw toepassing test, moet u ervoor zorgen dat deze waarde nooit groter is dan 256 KiB. Deze waarde wordt opnieuw ingesteld wanneer uw app opnieuw wordt opgestart of opnieuw wordt geïmplementeerd. Gebruik deze functie om bij benadering te kijken hoe dicht uw toepassing bij de aanbevolen limiet van 256 KiB komt.

Als u deze functies in uw toepassing op hoog niveau wilt gebruiken, neemt u het headerbestand applications.h op. U kunt deze functies tijdens de ontwikkeling gebruiken om een idee te krijgen van het algemene geheugengebruik van uw toepassing, maar u kunt ze ook samen met logboekregistratie gebruiken om informatie van apparaten in het veld vast te leggen. Het fragment Voor overgebruik en opschonen van geheugen laat zien hoe u onverwacht geheugengebruik kunt detecteren en correct kunt verwerken.

Notitie

Met deze functies wordt het geheugengebruik geretourneerd, zoals wordt gezien door het besturingssysteem. Op dit moment wordt het vrijmaken van geheugen door een toepassing voor toewijzingen op de heap van de gebruiker niet gerapporteerd door deze functies. Het geheugen wordt geretourneerd naar de malloc-bibliotheek voor toekomstig gebruik, maar de statistieken die door het besturingssysteem worden gerapporteerd, blijven ongewijzigd, tenzij het geheugen is toegewezen en vrijgemaakt door het besturingssysteem zelf. Een voorbeeld is het toewijzen van geheugen voor een socket. Daarom zijn deze functies handig om inzicht te krijgen in slechtste scenario's om uw toepassing conservatief te laten werken voor maximale betrouwbaarheid. Waarden zijn bij benadering en kunnen variëren in verschillende versies van het besturingssysteem.

Tracering van heap-geheugentoewijzing toevoegen

U kunt aanvullende informatie over geheugengebruik verkrijgen door heap-geheugentoewijzing bij te houden, waarin wordt weergegeven welke gebruikers- en kerneltoewijzingen worden gemaakt door statische en dynamisch gekoppelde bibliotheken. Dit biedt een volledigere afbeelding van waar geheugen door uw toepassing wordt gebruikt om u te helpen deze het effectiefst te gebruiken. Deze functie, beschikbaar met versie 21.07 of hoger van het Azure Sphere-besturingssysteem en versie ARV (Application Runtime) 10 of hoger, werkt alleen op een apparaat met ontwikkelingsfunctionaliteit en alleen wanneer de toepassing niet wordt uitgevoerd onder het foutopsporingsprogramma.

Notitie

U moet beide configuratietaken uitvoeren die in deze sectie worden beschreven, zodat het bijhouden van heap-geheugentoewijzing correct werkt. Als u dit niet doet, wordt er een waarschuwing gerapporteerd tijdens de compilatie en worden heapgeheugengegevens niet weergegeven.

Als u het bijhouden van heap-geheugentoewijzingen wilt inschakelen, moet u twee dingen doen:

  • Voeg de heapMemStats-mogelijkheid toe aan het app-manifest.json-bestand van uw toepassing:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Voeg de libmalloc-bibliotheek toe aan uw installatiekopieënpakket door deze toe te voegen DEBUG_LIB "libmalloc" aan de opdracht in het azsphere_target_add_image CMakeLists.txt-bestand van uw toepassing:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Belangrijk

Omdat het bijhouden van heap-geheugentoewijzing alleen werkt op apparaten met ontwikkeling, moet u het volgende doen om deze uit uw toepassing te verwijderen voordat u installatiekopiepakketten voor implementatie bouwt:

  • Verwijder de regel 'HeapMemStats': true' uit het app-manifest.json-bestand van uw toepassing.
  • Verwijder DEBUG_LIB "libmalloc" uit de opdracht in het azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" CMakeLists.txt-bestand van uw toepassing.

Visual Studio-prestatieprofiel gebruiken

Als u Visual Studio gebruikt, kunt u de functie prestatieprofiel gebruiken om informatie over het geheugengebruik van toepassingen op te halen. Zie zelfstudies/MemoryUsage voor een zelfstudie die gebruikmaakt van deze profiler.

Vereisten

  • Een Azure Sphere-ontwikkelkit die is verbonden met uw pc waarop Visual Studio wordt uitgevoerd, waarbij de Azure Sphere SDK is geïnstalleerd. Zie De Azure Sphere SDK voor Windows installeren.
  • Een apparaat dat is voorbereid voor ontwikkeling. Zie azsphere device enable-development. De prestatieprofielfunctie retourneert geen gegevens als uw apparaat niet is ingeschakeld voor ontwikkeling.

De profiler voor geheugengebruik starten

  1. Selecteer Prestatieprofiel opsporen>of druk op Alt+F2 om het startvenster van de performance profiler te openen.

    Visual Studio Performance Profiler-venster

  2. Als Azure Sphere Device Profiler niet zichtbaar is onder Analysedoel, selecteert u Doel kiezen en selecteert u Azure Sphere Device Profiler.

  3. Controleer onder Beschikbare hulpprogramma's of het geheugengebruik van Azure Sphere is ingeschakeld, selecteer vervolgens Start om het profileringsvenster voor geheugengebruik te openen en de geheugenprofiler te starten.

  4. Als u de toepassing wilt implementeren of opnieuw wilt starten, selecteert u Fouten opsporen>zonder foutopsporing of drukt u op Ctrl+F5 om uw toepassing op het apparaat te implementeren.

    Belangrijk

    Als u nauwkeurige RAM-gebruiksgegevens voor uw toepassing wilt ophalen, is het belangrijk dat u [uw app start zonder foutopsporing](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging). Als u uw app uitvoert onder het foutopsporingsprogramma, wordt het RAM-gebruik vergroot, omdat het geheugen dat door de foutopsporingsserver wordt verbruikt, wordt opgenomen in de gerapporteerde RAM-gebruiksstatistieken.

De profilergegevens voor geheugengebruik interpreteren

In het profileringsvenster voor geheugengebruik wordt een weergave weergegeven die er ongeveer als volgt uitziet:

Visual Studio Memory Usage Profiler-venster

In het midden van de weergave worden drie verschillende RAM-gebruiksstatistieken (weergegeven aan de dichtstbijzijnde KiB) als drie verschillende regels weergegeven terwijl uw app wordt uitgevoerd:

  • Totaal: Het totale fysieke geheugengebruik van uw app op het systeem, inclusief kerneltoewijzingen (zoals buffers voor sockets) namens uw app of de foutopsporingsserver.
  • Gebruiker: De hoeveelheid fysiek geheugen die rechtstreeks door uw app wordt gebruikt, het geheugen dat wordt gebruikt door bibliotheken namens de app (ook wel anontoewijzingen genoemd) en het geheugen dat wordt gebruikt door de foutopsporingsserver.
  • Piekgebruiker: de maximale hoeveelheid gebruikersgeheugen die in de huidige sessie wordt gebruikt. Wanneer u het geheugengebruik van uw toepassing test, moet u ervoor zorgen dat deze waarde nooit groter is dan 256 KiB. Extra geheugen is gereserveerd voor kerneltoewijzingen. Deze waarde wordt opnieuw ingesteld wanneer uw app opnieuw wordt opgestart of opnieuw wordt geïmplementeerd.

In de grafiek worden ook exemplaren van de gebeurtenis New Peak weergegeven (vertegenwoordigd door een driehoek). Deze gebeurtenis treedt op wanneer er een nieuw maximum is voor het geheugengebruik van piekgebruikers. De gebeurtenis is ingeschakeld voor toegankelijkheid van schermlezers.

Als u het bijhouden van heap-geheugentoewijzing hebt ingeschakeld en uw toepassing niet wordt uitgevoerd onder het foutopsporingsprogramma, ziet u een extra grafiek met heap-geheugenstatistieken:

  • Totaal heap: het totale heapgeheugen dat is toegewezen door of namens uw toepassing, inclusief van statische en dynamische bibliotheken.
  • Gedeelde bibliotheek heap: toewijzingen van dynamisch gekoppelde bibliotheken die worden geleverd door het Azure Sphere-besturingssysteem.

Geheugengebruik van Visual Studio heap

Boven de grafieken geeft een tijdlijnweergave de uitvoeringstijd van uw app weer, gecorreleerd met de gegevens in de onderstaande grafiek. Gebruik In - en uitzoomen om u te richten op bepaalde perioden.

Onder de grafieken worden in een tabelweergave dezelfde geheugenstatistieken en gebeurtenissen weergegeven.

Tip

Als u gegevens uit de tabel naar het klembord wilt kopiëren, drukt u op Ctrl+A om alle rijen te selecteren en vervolgens op Ctrl+C te drukken.

De eerste twee grafieken die in deze sectie worden weergegeven, zijn genomen tijdens het uitvoeren van fase 1 van de zelfstudie Geheugengebruik, die een geheugenlek bevat. Het geheugengebruik klimt monotonisch in elke grafiek, waardoor visueel bewijs voor het lek wordt geboden. Wanneer het lek is opgelost, zoals in fase 2 van de zelfstudie Over geheugengebruik, neemt de grafiek toe en daalt deze naarmate het geheugen wordt toegewezen en de toewijzing ervan ongedaan wordt gemaakt.

Geheugengebruik van Visual Studio heap zonder geheugenlek

Statistieken over het totale geheugengebruik weergeven

Met de opdracht show-memory-stats van de azsphere-apparaat-app worden geheugengebruiksstatistieken geretourneerd voor het totale geheugengebruik, het gebruik van de gebruikersmodus en het piekgebruik van de gebruikersmodus voor toepassingen die worden uitgevoerd op een gekoppeld apparaat. Op het apparaat moet de mogelijkheid van het appDevelopment-apparaat zijn geconfigureerd om deze opdracht uit te voeren.

De RAM-gebruiksstatistieken die worden weergegeven terwijl uw app wordt uitgevoerd, zijn:

  • Totaal (Kernel + gebruikersmodus): het totale fysieke geheugengebruik van uw app op het systeem, inclusief kerneltoewijzingen (zoals buffers voor sockets) namens uw app of de foutopsporingsserver.
  • Gebruikersmodus: de hoeveelheid fysiek geheugen die rechtstreeks door uw app wordt gebruikt, het geheugen dat wordt gebruikt door bibliotheken namens de app (ook wel anontoewijzingen genoemd) en het geheugen dat door de foutopsporingsserver wordt gebruikt.
  • Piekgebruikersmodus: de maximale hoeveelheid gebruikersgeheugen die in de huidige sessie wordt gebruikt. Wanneer u het geheugengebruik van uw toepassing test, moet u ervoor zorgen dat deze waarde nooit groter is dan 256 KiB. Extra geheugen is gereserveerd voor kerneltoewijzingen. Deze waarde wordt opnieuw ingesteld wanneer uw app opnieuw wordt opgestart of opnieuw wordt geïmplementeerd.

Als u het bijhouden van heap-geheugentoewijzing hebt ingeschakeld en uw toepassing niet wordt uitgevoerd onder het foutopsporingsprogramma, ziet u aanvullende regels heap-geheugenstatistieken:

  • Heap: App + statische bibliotheken: de kernel- en gebruikerstoewijzingen van uw code en bibliotheken die er statisch aan zijn gekoppeld.
  • Heap: dynamische bibliotheektoewijzingen>: <toewijzingen van afzonderlijke dynamisch gekoppelde bibliotheken die worden geleverd door het Azure Sphere-besturingssysteem.

Continue bewaking van geheugengebruik

Als u het geheugengebruik in de loop van de tijd wilt bewaken, kunt u scripts gebruiken om de opdracht azsphere device app show-memory-stats in een lus uit te voeren, zoals beschreven in de volgende voorbeelden:

Windows-opdrachtprompt

Maak met Kladblok of een andere teksteditor een batchscriptbestand memuse.bat met de volgende inhoud:

@echo off

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

Voer het batchscript uit door de naam te typen bij de opdrachtprompt (of het volledige pad naar het bestand, als het zich niet in de huidige map bevindt):

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

Als u het script wilt afsluiten, typt u Ctrl+C in het opdrachtpromptvenster en antwoordt u vervolgens op Y bij de prompt 'Batchtaak beëindigen?'.

Windows PowerShell

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

Geheugengebruik en het foutopsporingsprogramma

Wanneer u uw app uitvoert onder het foutopsporingsprogramma, bevatten de gerapporteerde geheugenstatistieken ook het geheugengebruik van het foutopsporingsserverproces en andere extra geheugengebruik veroorzaakt door foutopsporing, zoals het instellen van onderbrekingspunten. Daarom moet u uw app altijd uitvoeren zonder foutopsporing bij het verzamelen van nauwkeurige geheugenstatistieken.

Het gebruik van de profiler voor geheugengebruik kan echter handig zijn als u uw app uitvoert met het foutopsporingsprogramma. Het instellen van onderbrekingspunten en het doorlopen van coderegels tijdens het observeren van relatieve wijzigingen in het geheugenverbruik kan een handige techniek zijn voor het identificeren van de oorzaken van pieken in het geheugengebruik of geheugenlekken.

Bij foutopsporing in Visual Studio wordt de Performance Profiler automatisch geopend, maar wordt heap geheugentoewijzing niet bijgehouden.