Geheugengebruik in toepassingen op hoog niveau

In dit onderwerp vindt u meer informatie over geheugengebruik in toepassingen op hoog niveau. Zie Overwegingen voor geheugen en latentie beheren voor informatie over het beschikbare geheugen voor realtime compatibele 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. Er kan maximaal 1 KiB van deze ruimte worden toegewezen voor elk gedeeld bufferkanaal waarmee toepassingen op hoog niveau en RTApps communiceren.
  • 1 Alleen-lezen flashgeheugen van MiB, dat wordt gedeeld tussen de kernen op hoog niveau en realtime.
  • Lees-/schrijfopslag (veranderlijk) die blijft bestaan wanneer een apparaat opnieuw wordt opgestart. Zie Storage gebruiken in Azure Sphere voor meer informatie over onveranderbare opslag.

Opmerking

Als u de flitser herhaaldelijk bijwerkt, wordt deze uiteindelijk versleten en wordt deze ongeldig. Daarom moet u uw code ontwerpen om onnodige updates van de flash te voorkomen. Als u bijvoorbeeld de toepassingsstatus wilt opslaan voordat u wordt afgesloten, zodat u de opgeslagen status kunt herstellen na het opnieuw opstarten, kunt u overwegen de status van de toepassing alleen op te slaan in de flash als de status is gewijzigd.

Gebruik van flashgeheugen bepalen

Als u het flashgeheugengebruik wilt bepalen, moet u alleen rekening houden met de grootte van het installatiekopieënpakketbestand dat de metagegevens van de installatiekopieën, het toepassingsmanifest en de uitvoerbare installatiekopieën bevat. U hoeft geen rekening te houden met de opslag die is vereist voor 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. U hoeft ook niet de grootte van een volledige back-upkopie van uw toepassing op te nemen of de onderdelen die failover of rollback inschakelen in geval van beschadiging of problemen met over-the-air updates.

Tijdens de ontwikkeling en foutopsporing telt de grootte van het foutopsporingsprogramma echter wel mee voor 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 toepassingsinstallatiekopieënpakket en het foutopsporingsprogramma (indien aanwezig) de totale limiet van 1 MiB overschrijden. De opdracht azsphere image add --image waarmee een nieuwe afbeelding naar uw Azure Sphere-tenant wordt geüpload, retourneert ook een fout als het installatiekopieënpakket groter is dan 1 MiB.

De RAM-limiet van 256 KiB is alleen van toepassing op de toepassing; U hoeft ram-geheugen dat wordt gebruikt door het foutopsporingsprogramma niet toe te staan. 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-geheugen gebruikt, beëindigt het Azure Sphere-besturingssysteem dit 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 Levenscyclus van een toepassing voor meer informatie.

Raadpleeg best practices voor het beheren van RAM-gebruik in toepassingen op hoog niveau om vastlopers in uw toepassing te voorkomen als gevolg van een gebrek aan geheugen.

Ram-gebruik van runtime-toepassingen 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 opstarten als het geheugengebruik een drempelwaarde overschrijdt die u hebt opgegeven binnen de limiet van 256 KiB. De beschikbare functies zijn:

  • Applications_GetTotalMemoryUsageInKB: haal het totale geheugengebruik in kibibytes op. 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 een onbewerkte waarde (in KiB).
  • Applications_GetUserModeMemoryUsageInKB: haal het geheugengebruik van de gebruikersmodus op in kibibytes. Dit is de hoeveelheid fysiek geheugen die rechtstreeks door uw app wordt gebruikt, het geheugen dat namens de app wordt gebruikt door bibliotheken (ook wel anon-toewijzingen genoemd) en het geheugen dat wordt gebruikt door de foutopsporingsserver, geretourneerd als een onbewerkte waarde (in KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Krijg het geheugengebruik van de piek in de gebruikersmodus in kibibytes. Dit is 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 hoger 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 zien hoe dicht uw toepassing bij de aanbevolen limiet van 256 KiB komt.

Als u deze functies wilt gebruiken in uw toepassing op hoog niveau, neemt u het headerbestand applications.h op. U kunt deze functies tijdens de ontwikkeling gebruiken om een idee te krijgen van het totale geheugengebruik van uw toepassing, maar u kunt ze ook gebruiken in combinatie met logboekregistratie om informatie van apparaten in het veld vast te leggen. Het fragment Voor detectie en opschoning van geheugenoverbelasting laat zien hoe u onverwacht geheugengebruik kunt detecteren en afhandelen.

Opmerking

Deze functies retourneren het geheugengebruik zoals gezien door het besturingssysteem. Momenteel 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 voor het begrijpen van worst-case scenario's om uw toepassing conservatief te laten werken voor maximale betrouwbaarheid. Waarden zijn bij benadering en kunnen per besturingssysteemversie verschillen.

Het bijhouden van heap-geheugentoewijzing toevoegen

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

Opmerking

U moet beide configuratietaken voltooien die in deze sectie worden beschreven om het bijhouden van heap-geheugentoewijzing correct te laten werken. Als u dit niet doet, wordt er tijdens de compilatie een waarschuwing gerapporteerd en wordt heap-geheugeninformatie niet weergegeven.

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

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

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Voeg de libmalloc-bibliotheek toe aan uw installatiekopieënpakket door toe te voegen aan DEBUG_LIB "libmalloc" 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 waarvoor ontwikkeling is ingeschakeld, moet u het volgende doen om deze te verwijderen uit uw toepassing voordat u installatiekopiepakketten bouwt voor implementatie:

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

Visual Studio-prestatieprofiel gebruiken

Als u Visual Studio gebruikt, kunt u de functie prestatieprofielfunctie gebruiken om informatie op te halen over het geheugengebruik van de toepassing. Zie Tutorials/MemoryUsage voor een zelfstudie waarin deze profiler wordt gebruikt.

Voorwaarden

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-venster performance profiler

  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 Azure Sphere-geheugengebruik is ingeschakeld en selecteer vervolgens Start om het profileringsvenster voor geheugengebruik te openen en de geheugenprofielfunctie te starten.

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

    Belangrijk

    Voor nauwkeurige RAM-gebruiksgegevens voor uw toepassing is het belangrijk dat u [start uw app zonder foutopsporing](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). Het uitvoeren van uw app onder het foutopsporingsprogramma resulteert in een hoog RAM-gebruik, omdat geheugen dat wordt verbruikt door de foutopsporingsserver wordt opgenomen in de gerapporteerde statistieken over HET RAM-gebruik.

De gegevens van de profiler voor geheugengebruik interpreteren

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

Visual Studio-venster voor geheugengebruiksprofiel

In het midden van de weergave worden in de grafiek Fysiek geheugen van azure Sphere-apparaten drie verschillende statistieken over RAM-gebruik (weergegeven op de dichtstbijzijnde KiB) weergegeven als drie verschillende regels terwijl uw app wordt uitgevoerd:

  • Totale: 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 namens de app wordt gebruikt door bibliotheken (ook wel anon-toewijzingen 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 hoger 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 Nieuwe piek weergegeven (vertegenwoordigd door een driehoek). Deze gebeurtenis treedt op wanneer er een nieuw maximum is voor piekgeheugengebruik van gebruikers. De gebeurtenis is ingeschakeld voor de toegankelijkheid van de schermlezer.

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

  • Total Heap: het totale heap-geheugen dat door of namens uw toepassing is toegewezen, inclusief uit statische en dynamische bibliotheken.
  • Shared Library Heap: toewijzingen van dynamisch gekoppelde bibliotheken die worden geleverd door het Azure Sphere-besturingssysteem.

Heap-geheugengebruik in Visual Studio

Boven de grafieken wordt in een tijdlijnweergave de uitvoeringstijd van uw app weergegeven, gecorreleerd met de gegevens in de onderstaande grafiek. Gebruik In- en Uitzoomen om u op specifieke perioden te concentreren.

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 drukt u vervolgens op Ctrl+C.

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

Heap-geheugengebruik van Visual Studio zonder geheugenlek

Statistieken over het totale geheugengebruik weergeven

De opdracht azsphere device app show-memory-stats retourneert geheugengebruiksstatistieken over het totale geheugengebruik, gebruikersmodusgebruik en piekgebruik in de gebruikersmodus voor toepassingen die worden uitgevoerd op een gekoppeld apparaat. Op het apparaat moet de appDevelopment-apparaatmogelijkheid zijn geconfigureerd om deze opdracht uit te voeren.

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

  • Totaal (Kernel en 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 namens de app wordt gebruikt door bibliotheken (ook wel anon-toewijzingen genoemd) en het geheugen dat wordt gebruikt door de foutopsporingsserver.
  • 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 hoger 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 extra regels met heapgeheugenstatistieken:

  • Heap: App + statische bibliotheken: de kernel- en gebruikerstoewijzingen van uw code en eventuele 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 beantwoordt u vervolgens Y op 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 ander aanvullend geheugengebruik dat wordt veroorzaakt door foutopsporing, zoals het instellen van onderbrekingspunten. Daarom moet u uw app altijd uitvoeren zonder foutopsporing wanneer u nauwkeurige geheugenstatistieken probeert te verzamelen.

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 performance profiler automatisch geopend, maar wordt heap-geheugentoewijzing niet bijgehouden.