Využití paměti v aplikacích vysoké úrovně

Toto téma obsahuje podrobnosti o využití paměti v aplikacích vysoké úrovně. Informace o paměti dostupné pro aplikace s podporou v reálném čase (RTApps) najdete v tématu Důležité informace o správě paměti a latence .

Aplikace vysoké úrovně mají přístup k následující paměti a úložišti:

  • 256 KiB RAM na jádru vysoké úrovně, vyhrazené výhradně pro použití aplikací na vysoké úrovni. Každému sdílenému kanálu vyrovnávací paměti, přes který komunikují aplikace vysoké úrovně a RTApps, může být přidělen až 1 KiB tohoto prostoru.
  • 1 paměť Flash MiB jen pro čtení, která se sdílí mezi jádry vysoké úrovně a jádra v reálném čase.
  • Úložiště pro čtení a zápis (proměnlivé), které se zachová při restartování zařízení. Informace o proměnlivých úložištích najdete v tématu Použití úložiště v Azure Sphere.

Poznámka

Opakovaná aktualizace blesku ho nakonec opotřebuje a způsobí, že je neplatný. Proto byste měli navrhnout kód tak, aby nedocházelo ke zbytečným aktualizacím flash. Pokud například chcete před ukončením uložit stav aplikace, abyste mohli po restartování obnovit uložený stav, zvažte uložení stavu aplikace do režimu flash pouze v případě, že se stav změnil.

Určení využití paměti flash

Pokud chcete zjistit využití paměti flash, vezměte v úvahu pouze velikost souboru balíčku obrázku, který obsahuje metadata obrázku, manifest aplikace a spustitelný obrázek. Nemusíte počítat s úložištěm vyžadovaným komponentami poskytovanými Microsoftem, jako je operační systém Azure Sphere nebo služby za běhu a sdílené knihovny, které řídí periferie a umožňují připojení k Azure IoT Hub. Stejně tak nemusíte zahrnout velikost úplné záložní kopie vaší aplikace ani součásti, které umožňují převzetí služeb při selhání nebo vrácení zpět v případě poškození nebo problémů s aktualizacemi prostřednictvím technologie.

Během vývoje a ladění se však velikost ladicího programu počítá do limitu. Ladicí program se automaticky přidá pomocí příkazu az sphere device enable-development a odebere ho nástroj [az sphere device enable-cloud-test](.). /reference/az sphere-device.md). Velikost ladicího programu používaného sadou SDK můžete zjistit vyhledáním souboru gdbserver.imagepackage ve složce DebugTools instalačního adresáře sady Microsoft Azure Sphere SDK.

Příkaz az sphere device sideload vrátí chybu, pokud balíček image aplikace a ladicí program (pokud je k dispozici) překročí celkový limit 1 MiB. Příkaz az sphere image add --image , který nahraje novou image do katalogu Azure Sphere, také vrátí chybu, pokud balíček image překročí 1 MiB.

Limit 256 KiB RAM se vztahuje pouze na aplikaci; nemusíte povolit paměť RAM používanou ladicím programem. Další paměť je vyhrazená pro přidělení jádra.

Dostupný flash a paměť RAM se může zvýšit (ale nikdy se nezmenší) pro aplikace napsané pro aktuální čip Azure Sphere (MT3620). Budoucí čipy Azure Sphere můžou mít různá omezení.

Podmínky nedostatku paměti

Pokud vaše aplikace používá příliš mnoho paměti RAM, operační systém Azure Sphere ji ukončí pomocí signálu SIGKILL. Například v ladicím programu uvidíte následující:

Child terminated with signal = 0x9 (SIGKILL)

Signál SIGKILL také nastane, pokud se aplikaci vysoké úrovně nepodaří ukončit poté, co obdrží požadavek SIGTERM. Podrobnosti najdete v tématu Životní cyklus aplikace .

Pokud chcete zabránit chybám v aplikaci kvůli nedostatku paměti, přečtěte si osvědčené postupy pro správu využití paměti RAM v aplikacích vysoké úrovně.

Určení využití paměti RAM aplikace za běhu

Azure Sphere poskytuje několik funkcí pro získání informací o využití paměti za běhu. Můžete je použít ke sledování využití paměti aplikace vysoké úrovně, což vám umožní bezpečně restartovat aplikaci, pokud využití paměti překročí zadaná prahová hodnota v rámci limitu 256 KiB. Dostupné funkce jsou:

  • Applications_GetTotalMemoryUsageInKB: Získejte celkové využití paměti v kibibajtech. Jedná se o celkové využití fyzické paměti vaší aplikace v systému, včetně přidělení jádra (například vyrovnávací paměti pro sokety) jménem vaší aplikace nebo ladicího serveru, které se vrátí jako nezpracovaná hodnota (v KiB).
  • Applications_GetUserModeMemoryUsageInKB: Získejte využití paměti v kibibajtech v uživatelském režimu. Jedná se o množství fyzické paměti používané přímo vaší aplikací, paměť využívanou všemi knihovnami jejím jménem (označovaná také jako přidělení anon ) a paměť využívaná ladicím serverem vrácená jako nezpracovaná hodnota (v KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Získejte maximální využití paměti uživatelského režimu v kibibajtech. Jedná se o maximální velikost uživatelské paměti využité v aktuální relaci. Při testování využití paměti vaší aplikace byste měli zajistit, aby tato hodnota nikdy nepřekročila 256 KiB. Tato hodnota se resetuje při každém restartování nebo opětovném nasazení aplikace. Pomocí této funkce můžete získat přibližný přehled o tom, jak se vaše aplikace blíží doporučenému limitu 256 KiB.

Pokud chcete tyto funkce použít v aplikaci vysoké úrovně, zahrňte soubor hlaviček applications.h. Tyto funkce můžete použít během vývoje, abyste získali představu o celkovém využití paměti vaší aplikace, ale můžete je také použít společně s protokolováním k zachycení informací ze zařízení v terénu. Fragment kódu Detekce a vyčištění nadměrného využití paměti ukazuje, jak zjistit a řádně zpracovat neočekávané využití paměti.

Poznámka

Tyto funkce vrací využití paměti, jak je vidět v operačním systému. V současné době tyto funkce nehlásí uvolnění paměti aplikací pro přidělení na haldě uživatele. Paměť se vrátí do knihovny malloc pro budoucí použití, ale statistiky hlášené operačním systémem zůstanou beze změny, pokud paměť nebude přidělena a uvolněna samotným operačním systémem. Příkladem může být přidělení paměti soketu. Proto jsou tyto funkce užitečné pro pochopení scénářů v nejhorších případech, aby vaše aplikace fungovala konzervativně a dosáhla maximální spolehlivosti. Hodnoty jsou přibližné a v různých verzích operačního systému se můžou lišit.

Přidání sledování přidělení paměti haldy

Další informace o využití paměti můžete získat přidáním sledování přidělení paměti haldy, které ukazuje, jaké přidělení uživatelů a jádra provádí statické a dynamicky propojené knihovny. Získáte tak úplný přehled o tom, kde vaše aplikace používá paměť, abyste ji mohli využívat co nejúčelněji. Tato funkce, která je k dispozici s operačním systémem Azure Sphere verze 21.07 nebo novější a verzí modulu runtime aplikací (ARV) 10 nebo novější, funguje pouze na zařízení s povoleným vývojem a pouze v případě, že aplikace není spuštěná v ladicím programu.

Poznámka

Aby sledování přidělení paměti haldy fungovalo správně, musíte dokončit obě úlohy konfigurace popsané v této části. Pokud se vám to nepodaří, během kompilace se zobrazí upozornění a informace o paměti haldy se nezobrazí.

Pokud chcete povolit sledování přidělení paměti haldy, musíte udělat dvě věci:

  • Přidejte funkci HeapMemStats do souboru app-manifest.json vaší aplikace:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Přidejte knihovnu libmalloc do balíčku image přidáním DEBUG_LIB "libmalloc" příkazu azsphere_target_add_image do souboru CMakeLists.txt vaší aplikace:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Důležité

Vzhledem k tomu, že sledování přidělení paměti haldy funguje jenom na zařízeních s podporou vývoje, měli byste ho před vytvořením balíčků imagí pro nasazení z aplikace odebrat následujícím postupem:

  • Odstraňte řádek HeapMemStats: true ze souboru app-manifest.json vaší aplikace.
  • Odeberte DEBUG_LIB "libmalloc" z azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" příkazu v souboru CMakeLists.txt vaší aplikace.

Použití profileru výkonu sady Visual Studio

Pokud používáte Visual Studio, můžete pomocí funkce profileru výkonu získat informace o využití paměti aplikace. Kurz, který používá tento profiler, najdete v tématu Kurzy/MemoryUsage.

Požadavky

Spuštění profileru využití paměti

  1. Vyberte Ladit>profiler výkonu nebo stiskněte Alt+F2 a otevřete úvodní okno profileru výkonu.

    Okno profileru výkonu sady Visual Studio

  2. Pokud se v části Cíl analýzy nezobrazuje Azure Sphere Device Profiler , vyberte Zvolit cíl a vyberte Azure Sphere Device Profiler.

  3. V části Dostupné nástroje se ujistěte, že je zaškrtnuté využití paměti Azure Sphere , a pak výběrem možnosti Start otevřete okno profilace využití paměti a spusťte profiler paměti.

  4. Pokud potřebujete nasadit nebo restartovat aplikaci, vyberte Spustit ladění>bez ladění nebo stiskněte Ctrl+F5 a nasaďte aplikaci do zařízení.

    Důležité

    Pokud chcete získat přesné informace o využití paměti RAM pro vaši aplikaci, je důležité, abyste aplikaci [spustili bez ladění](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging). Spuštění aplikace v ladicím programu způsobí zvýšení využití paměti RAM, protože paměť spotřebovaná ladicím serverem bude zahrnuta do hlášených statistik využití paměti RAM.

Interpretace dat profileru využití paměti

V okně profilace využití paměti se zobrazí podobné zobrazení:

Okno profileru využití paměti sady Visual Studio

Uprostřed zobrazení graf fyzické paměti zařízení Azure Sphere vykresluje tři různé statistiky využití paměti RAM (zobrazené nejbližšímu KiB) jako tři různé řádky, zatímco je vaše aplikace spuštěná:

  • Celkem: Celkové využití fyzické paměti vaší aplikace v systému, včetně přidělení jádra (například vyrovnávací paměti pro sokety) jménem vaší aplikace nebo ladicího serveru.
  • Uživatele: Množství fyzické paměti využité přímo vaší aplikací, paměť využitá všemi knihovnami jejím jménem (označovaná také jako přidělení anon ) a paměť využívaná ladicím serverem.
  • Uživatel ve špičce: Maximální velikost uživatelské paměti využité v aktuální relaci. Při testování využití paměti vaší aplikace byste měli zajistit, aby tato hodnota nikdy nepřekročila 256 KiB. Další paměť je vyhrazená pro přidělení jádra. Tato hodnota se resetuje při každém restartování nebo opětovném nasazení aplikace.

Graf také vykreslí výskyty události New Peak (reprezentované trojúhelníkem). K této události dochází vždy, když existuje nové maximum pro využití paměti uživatele ve špičce. Událost je povolená pro přístupnost čtečky obrazovky.

Pokud jste povolili sledování přidělení paměti haldy a vaše aplikace není spuštěná v ladicím programu, zobrazí se další graf zobrazující statistiky paměti haldy:

  • Celkový počet hald: Celková paměť haldy přidělená vaší aplikací nebo jménem vaší aplikace, včetně ze statických a dynamických knihoven.
  • Halda sdílené knihovny: Přidělení z dynamicky propojených knihoven poskytovaných operačním systémem Azure Sphere.

Využití paměti haldy sady Visual Studio

Nad grafy se v zobrazení časové osy zobrazuje doba běhu vaší aplikace v korelaci s daty v následujícím grafu. Pomocí funkce Přiblížit a Oddálit se můžete zaměřit na konkrétní časová období.

Pod grafy se v zobrazení tabulky zobrazují stejné statistiky paměti a události.

Tip

Pokud chcete zkopírovat data z tabulky do schránky, vyberte stisknutím ctrl+A všechny řádky a pak stiskněte Ctrl+C.

První dva grafy uvedené v této části byly pořízeny při spuštění fáze 1 kurzu Využití paměti, který obsahuje nevracení paměti. Využití paměti se v každém grafu monotónně vyšplhá a poskytuje vizuální důkaz o nevracení. Když je nevracení opravené, jako ve fázi 2 kurzu Využití paměti, graf se zvyšuje a klesá při přidělování a uvolnění paměti.

Využití paměti haldy sady Visual Studio bez nevracení paměti

Zobrazení statistik o celkovém využití paměti

Příkaz az sphere device app show-memory-stats vrátí statistiku využití paměti o celkovém využití paměti, využití uživatelského režimu a maximálním využití uživatelského režimu pro aplikace spuštěné na připojeném zařízení. Aby bylo možné spustit tento příkaz, musí mít zařízení nakonfigurovanou schopnost zařízení appDevelopment .

Statistiky využití paměti RAM zobrazené za běhu aplikace:

  • Total (jádro + uživatelský režim): Celkové využití fyzické paměti vaší aplikace v systému, včetně přidělení jádra (například vyrovnávacích pamětí pro sokety) jménem vaší aplikace nebo ladicího serveru.
  • Uživatelský režim: Množství fyzické paměti používané přímo vaší aplikací, paměť využívaná všemi knihovnami jejím jménem (označovaná také jako přidělení anon ) a paměť využívaná ladicím serverem.
  • Režim uživatele ve špičce: Maximální velikost paměti uživatele využité v aktuální relaci. Při testování využití paměti vaší aplikace byste měli zajistit, aby tato hodnota nikdy nepřekročila 256 KiB. Další paměť je vyhrazená pro přidělení jádra. Tato hodnota se resetuje při každém restartování nebo opětovném nasazení aplikace.

Pokud jste povolili sledování přidělení paměti haldy a vaše aplikace není spuštěná v ladicím programu, zobrazí se další řádky statistiky paměti haldy:

  • Halda: Aplikace a statické knihovny: Přidělení jádra a uživatele z vašeho kódu a všech knihoven, které jsou s ním staticky propojené.
  • Halda: <Přidělení dynamických> knihoven: Přidělení z jednotlivých dynamicky propojených knihoven poskytovaných operačním systémem Azure Sphere

Nepřetržité monitorování využití paměti

Pokud chcete monitorovat využití paměti v průběhu času, můžete použít skripty ke spuštění [az sphere device app show-memory-stats](.. Příkaz /reference/az sphere-device.md) ve smyčce, jak je popsáno v následujících příkladech:

Příkazový řádek Windows

Pomocí Poznámkového bloku nebo jiného textového editoru vytvořte soubor dávkového skriptu memuse.bat s následujícím obsahem:

@echo off

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

Spusťte dávkový skript zadáním jeho názvu na příkazovém řádku (nebo úplnou cestu k souboru, pokud není v aktuálním adresáři):

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

Skript ukončíte tak, že v okně příkazového řádku zadáte Ctrl+C a pak odpovíte Y na výzvu Ukončit dávkovou úlohu.

Windows PowerShell

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

Využití paměti a ladicí program

Při spouštění aplikace v ladicím programu zahrnují statistiky hlášené paměti také využití paměti procesem ladicího serveru a další další využití paměti způsobené laděním, například nastavením zarážek. Z tohoto důvodu byste při pokusu o shromažďování přesných statistik paměti měli aplikaci vždy spouštět bez ladění.

Použití profileru využití paměti ale může být užitečné, pokud aplikaci spustíte s ladicím programem. Nastavení zarážek a krokování řádků kódu při sledování relativních změn ve spotřebě paměti může být užitečnou technikou pro identifikaci příčin špičky využití paměti nebo nevrácení paměti.

Při ladění v sadě Visual Studio se profiler výkonu otevře automaticky, ale nezobrazuje sledování přidělení paměti haldy.