Osvědčené postupy pro správu využití paměti RAM v aplikacích vysoké úrovně
I když operační systém Azure Sphere používá jako základ jádro Linuxu, je důležité si uvědomit, že stále píšete aplikace pro vložené zařízení s významnými omezeními paměti RAM. Použití správných vložených programovacích postupů vám pomůže vytvářet spolehlivé aplikace Azure Sphere.
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í. Spuštění aplikace v ladicím programu způsobí zvýšení využití paměti RAM, protože paměť RAM spotřebovaná ladicím serverem bude zahrnuta do hlášených statistik využití paměti RAM. Další informace o statistikách paměti pro aplikaci spuštěnou na připojeném zařízení najdete v tématu Využití paměti v aplikacích vysoké úrovně.
Tady je několik osvědčených postupů:
- Přidělte paměť předem (ideálně staticky) a nechte ji přidělenou po celou dobu života aplikace, kdykoli je to možné. Tím se výrazně zvýší determinismus využití paměti RAM vaší aplikace a sníží se riziko nárůstu nároků na paměť a fragmentace po celou dobu životnosti aplikace.
- Pokud je dynamické přidělování naprosto nezbytné:
- Pokuste se minimalizovat frekvenci přidělení paměti haldy a uvolnění, které aplikace provádí, aby se snížila rizika fragmentace paměti haldy, například využitím technik přidělení bloků dat nebo fondu paměti.
- Zkontrolujte stránky zásobníku a pokud je to možné, zalamujte volání do
malloc()
pomocí volání, abymemset()
se stránky vynutily potvrzení. To pomáhá zajistit, že pokud přidělení způsobí, že aplikace překročí limit paměti RAM, operační systém ho okamžitě a předvídatelně ukončí. Čekání na přístup k přiděleným stránkám bude představovat riziko zpožděného výpadku paměti, který se obtížně reprodukuje a diagnostikuje. - Povolte sledování přidělení paměti haldy ve vývojovém režimu.
- Vyhněte se použití
Log_Debug
s velkými řetězci a odeberte tato volání (například pomocí#ifdef
), pokud nejsou ve vývojovém režimu.Log_Debug
způsobuje přidělení dočasných vyrovnávacích pamětí, což vede k náhlému nárůstu využití paměti RAM při použití s velkými řetězci. - Rozhraní EventLoop API používejte, kdykoli je to možné, pro pravidelné asynchronní úlohy (například interakce s periferními zařízeními) místo vytváření vláken. Vytváření vláken způsobí, že jádro Linuxu přidělí další paměť přiřazenou vaší aplikaci. Tím se snižuje determinismus vaší aplikace, protože se zvyšuje pravděpodobnost, že plánovač operačního systému přepne mezi několika jedinečnými operacemi, které můžou způsobit překročení limitu paměti RAM vaší aplikace. Mnoho ukázkových aplikací Azure Sphere, například GPIO_HighLevelApp, ukazuje, jak používat EventLoop.
- Vyhněte se předčasnému používání mezipamětí paměti pro hodnoty, které je možné přepočítejte za běhu.
- Při použití knihovny libcurl:
Při použití knihovny libcurl vylaďte maximální velikosti vyrovnávací paměti soketů. Operační systém Azure Sphere přidělí vyrovnávací paměti soketů, které jsou přičítány využití paměti RAM vaší aplikace. Snížení těchto velikostí vyrovnávací paměti může být dobrým způsobem, jak snížit nároky na paměť RAM vaší aplikace. Upozorňujeme, že příliš malé vyrovnávací paměti soketů budou mít nepříznivý vliv na výkon knihovny libcurl. Místo toho vylaďte maximální velikosti vyrovnávací paměti pro váš scénář:
static int sockopt_callback(void* clientp, curl_socket_t curlfd, curlsocktype purpose) { int size = /*specify max buffer sizes here (in bytes)*/ int size_size = sizeof(size); setsockopt(curlfd, SOL_SOCKET, SO_SNDBUF, &size, &size_size); setsockopt(curlfd, SOL_SOCKET, SO_RCVBUF, &size, &size_size); return CURL_SOCKOPT_OK; } // Place the following along with other calls to curl_easy_setopt curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, &sockopt_callback);
Projděte si dokumentaci k CURLOPT_SOCKOPTFUNCTION libcurl.
Parametry CURLOPT_BUFFERSIZE vyšší úrovně a CURLOPT_UPLOAD_BUFFERSIZE je možné podobně vyladit.
Libcurl také podporuje přepsání funkcí interní paměti pomocí
curl_global_init_mem
a předáváním funkcí zpětného volání promalloc
,free
,realloc
,strdup
acalloc
. Tato funkce umožňuje sledovat dynamické přidělování nebo dokonce měnit chování. Můžete například předem přidělit fond paměti a pak pomocí těchto zpětných volání přidělit paměť libcurl z tohoto fondu. To může být účinná technika pro nastavení mantinely a zvýšení determinismu vaší aplikace. Další informace o tom, jak tato zpětná volání používat, najdete v dokumentaci k curl_global_init_mem libcurl.Poznámka
Tento mechanismus zpětného volání nepokrývá všechna přidělení paměti způsobená knihovnou libcurl, pouze ta, která provádí přímo samotný nástroj libcurl. Konkrétně se nesledují přidělení, které provádí wolfSSL dole.