Sdílet prostřednictvím


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

Důležité

Toto je dokumentace k Azure Sphere (starší verze). Azure Sphere (starší verze) se vyřazuje 27. září 2027 a uživatelé musí do této doby migrovat do Azure Sphere (integrované). K zobrazení dokumentace k Azure Sphere (integrované) použijte selektor verzí umístěný nad obsahem.

Toto téma obsahuje podrobnosti o využití paměti v aplikacích vysoké úrovně. Informace o paměti dostupné pro aplikace podporující v reálném čase (RTApps) najdete v tématu Správa důležitých informací o paměti a latenci.

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

  • 256 KiB RAM na jádru vysoké úrovně, rezervované zcela pro použití aplikací vysoké úrovně. Až 1 KiB tohoto prostoru může být přiděleno pro každý sdílený kanál vyrovnávací paměti, prostřednictvím kterého aplikace vysoké úrovně a RTApps komunikují.
  • 1 Paměť flash jen pro čtení MiB, která se sdílí mezi jádry vysoké úrovně a jádry 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ém úložišti najdete v tématu Použití úložiště v Azure Sphere.

Poznámka:

Opakovaná aktualizace blesku ho nakonec opotřebuje a zneplatní. Proto byste měli navrhnout kód tak, aby se zabránilo zbytečným aktualizacím blesku. 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 na 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, zvažte pouze velikost souboru balíčku image, která zahrnuje metadata image, manifest aplikace a spustitelný obrázek. Nemusíte počítat s úložištěm vyžadovaným komponentami od Microsoftu, jako jsou operační systém Azure Sphere nebo služby za běhu a sdílené knihovny, které řídí periferní zařízení a umožňují připojení k Azure IoT Hubu. Podobně nemusíte zahrnout velikost úplné záložní kopie aplikace nebo součástí, 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 přeletovými aktualizacemi.

Během vývoje a ladění se však velikost ladicího programu počítá do limitu. Ladicí program se automaticky přidá nástrojem azsphere device enable-development a odebere ho azsphere device enable-cloud-test. Velikost ladicího programu používaného sadou SDK najdete vyhledáním balíčku gdbserver.imagepackage ve složce DebugTools instalačního adresáře sady Microsoft Azure Sphere SDK.

Příkaz azsphere 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 azsphere image add --image , který nahraje novou image do tenanta Azure Sphere, vrátí také chybu, pokud balíček image překročí 1 MiB.

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

Dostupný flash a paměť RAM se můžou 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í.

Nedostatek paměti

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

Child terminated with signal = 0x9 (SIGKILL)

K signálu SIGKILL dochází také v případě, že se aplikaci vysoké úrovně nepodaří ukončit, jakmile obdrží požadavek SIGTERM. Podrobnosti najdete v části Životní cyklus aplikace .

Pokud chcete zabránit chybám ve vaší aplikaci kvůli stavu 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 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 k monitorování využití paměti aplikace vysoké úrovně, což vám umožní bezpečně restartovat aplikaci, pokud využití paměti překročí prahovou hodnotu, kterou zadáte 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ích pamětí 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 uživatelském režimu v kibibajtech. Jedná se o množství fyzické paměti používané přímo vaší aplikací, paměť používanou všemi knihovnami jejím jménem (označované také jako přidělení anon ) a paměť používaná ladicím serverem, vrácená jako nezpracovaná hodnota (v KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Získejte využití paměti uživatelského režimu ve špičce v kibibajtech. Toto je maximální množství paměti uživatele použité v aktuální relaci. Při testování využití paměti 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 získáte přibližný přehled o tom, jak se aplikace blíží doporučenému limitu 256 KiB.

Pokud chcete tyto funkce použít ve vaší 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 zaznamenání informací ze zařízení v terénu. Fragment fragmentu detekce a čištění nadměrného využití paměti ukazuje, jak detekovat 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 neoznamují uvolnění paměti aplikací pro přidělení haldy uživatele. Paměť bude vrácena do knihovny malloc pro budoucí použití, ale statistiky hlášené operačním systémem zůstanou beze změny, pokud paměť nebyla přidělena a uvolněna samotným operačním systémem. Příkladem by bylo přidělení paměti pro soket. Proto jsou tyto funkce užitečné pro pochopení nejhorších scénářů, které vaší aplikaci pomůžou pracovat konzervativně za účelem maximální spolehlivosti. Hodnoty jsou přibližné a můžou se lišit v různých verzích operačního systému.

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 jader provádí statické a dynamicky propojené knihovny. Tím získáte úplný přehled o tom, kde aplikace používá paměť, abyste ji mohli co nejpřesněji používat. Tato funkce, která je dostupná 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 podporou vývoje a pouze v případě, že aplikace není spuštěná v ladicím programu.

Poznámka:

Abyste mohli správně fungovat, musíte dokončit obě úlohy konfigurace popsané v této části, aby sledování přidělení paměti haldy fungovalo správně. Pokud to neuděláte, 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 do souboru app-manifest.json vaší aplikace funkci HeapMemStats:

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

    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 sestavením balíčků imagí pro nasazení odebrat z aplikace takto:

  • 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 Profiler výkonu ladění>nebo stisknutím alt+F2 otevřete úvodní okno profileru výkonu.

    Okno profileru výkonu sady Visual Studio

  2. Pokud v části Cíl analýzy není profiler zařízení Azure Sphere viditelný, vyberte Zvolit cíl a vyberte Profiler zařízení Azure Sphere.

  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 stisknutím kombinace kláves Ctrl+F5 aplikaci nasaďte 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é [spustit aplikaci bez ladění](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). Spuštění aplikace pod ladicím programem způsobí nafouknutí 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í zobrazení podobné tomuto:

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

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

  • Celkem: Celkové využití fyzické paměti aplikace v systému, včetně přidělení jádra (jako jsou vyrovnávací paměti pro sokety) jménem vaší aplikace nebo ladicího serveru.
  • Uživatel: Množství fyzické paměti používané přímo vaší aplikací, paměť používaná všemi knihovnami jejím jménem (označovaná také jako přidělení anon ) a paměť používaná ladicím serverem.
  • Uživatel ve špičce: Maximální množství paměti uživatele použité v aktuální relaci. Při testování využití paměti aplikace byste měli zajistit, aby tato hodnota nikdy nepřekročila 256 KiB. Další paměť je vyhrazena 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ž dojde k novému maximu 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á halda: Celková paměť haldy přidělená vaší aplikací nebo jménem vaší aplikace, včetně ze statických a dynamických knihoven.
  • Sdílená halda knihovny: Přidělení 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 zobrazí doba běhu vaší aplikace, která koreluje s daty v grafu níže. Pomocí funkce Přiblížit a Oddálit se můžete zaměřit na konkrétní časová období.

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

Tip

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

Při spuštění fáze 1 kurzu Využití paměti, který obsahuje nevracení paměti, byly pořízeny první dva grafy uvedené v této části. Využití paměti v každém grafu monotonicky stoupá a poskytuje vizuální důkazy o úniku. Pokud je nevracení opraveno, jak je ve fázi 2 kurzu Využití paměti, graf stoupá a padá při přidělování a uvolnění paměti.

Využití paměti haldy sady Visual Studio bez nevrácení paměti

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

Příkaz azsphere device show-memory-stats vrátí statistiky využití paměti o celkovém využití paměti, využití uživatelského režimu a špičku využití uživatelského režimu pro aplikace spuštěné na připojeném zařízení. Zařízení musí mít nakonfigurovanou funkci zařízení appDevelopment pro spuštění tohoto příkazu.

Statistika využití paměti RAM zobrazená v době, kdy je vaše aplikace spuštěná, jsou:

  • Total (Kernel + User Mode): Celkové využití fyzické paměti 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živatelský režim: Množství fyzické paměti používané přímo vaší aplikací, paměť používaná všemi knihovnami jeho jménem (označované také jako přidělení anon ) a paměť používanou ladicím serverem.
  • Režim uživatele ve špičce: Maximální množství paměti uživatele použité v aktuální relaci. Při testování využití paměti aplikace byste měli zajistit, aby tato hodnota nikdy nepřekročila 256 KiB. Další paměť je vyhrazena 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: App + Statické knihovny: Přidělení jádra a uživatelů z vašeho kódu a všech knihoven staticky propojených s ním.
  • Halda: <Dynamické přidělování> knihoven: Přidělení z jednotlivých dynamicky propojených knihoven poskytovaných operačním systémem Azure Sphere.

Průběžné monitorování využití paměti

Pokud chcete monitorovat využití paměti v průběhu času, můžete pomocí skriptů spustit příkaz azsphere device show-memory-stats 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 azsphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop

Spuštění dávkového skriptu zadáním jeho názvu do příkazového řádku (nebo úplné cesty 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
 -------------------------- -------------

Pokud chcete skript ukončit, do okna příkazového řádku zadejte Ctrl+C a pak odpovězte na výzvu Ukončit dávkovou úlohu.

Windows PowerShell

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

Využití paměti a ladicí program

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

Použití profileru využití paměti ale může být užitečné, pokud spustíte aplikaci pomocí ladicího programu. Nastavení zarážek a procházení řádků kódu při sledování relativních změn spotřeby paměti může být užitečnou technikou pro identifikaci příčin špiček využití paměti nebo nevracení 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.