管理高階應用程式中 RAM 使用量的最佳做法

雖然 Azure 球體 OS 使用 Linux 核心做為基底,但請務必記住,您仍在撰寫具有重大 RAM 限制式之內嵌裝置的應用程式。 套用良好的內嵌程式設計做法可協助您建立可靠的 Azure 球體應用程式。

重要

若要為應用程式取得正確的 RAM 使用資訊,請務必 在不 偵錯的情況下執行應用程式。 在偵錯程式下執行您的應用程式會導致 RAM 使用量過大,因為偵錯伺服器所耗用的 RAM 會包含在回報的 RAM 使用狀況統計資料中。 如需在附加裝置上執行之應用程式的記憶體統計資料詳細資訊,請參閱 在高階應用程式中使用記憶體

以下是一些最佳作法:

  • 預先配置記憶體 (最好是靜態) ,並盡可能在應用程式的存留期中進行配置。 這會大幅提升應用程式 RAM 使用量的不確定性,並降低記憶體腳印在應用程式生命週期中增加和分散的風險。
  • 當絕對必要動態配置時:
    • 嘗試將應用程式執行的堆積記憶體配置和處理頻率降到最低,以降低堆積記憶體分散的風險,例如,利用區塊配置/記憶體集區技術。
    • 檢閱堆疊頁面,並在可能的情況下,使用來電 memset() 來回撥電話 malloc() ,以強制確認頁面。 這有助於確保如果配置導致應用程式超過 RAM 限制,作業系統會立即且可預期地終止該配置。 等待存取配置的頁面會造成記憶體不足延遲當機的風險,而這較難重現和診斷。
    • 在開發模式中啟用 堆記憶體配置追蹤
  • 避免搭配大型字串使用 Log_Debug ,並移除這些呼叫 (例如, #ifdef 在未處於開發模式時) 。 Log_Debug 造成配置暫時緩衝區,導致搭配大型字串使用時,RAM 使用量突然突然出現。
  • 如果定期非同步工作 (例如與周邊設備互動) 而非建立對話,請盡可能使用 EventLoop API。 建立執行緒會讓 Linux 核心配置其他記憶體至您的應用程式。 這會降低應用程式的不確定性,因為它會增加作業系統排程器在多個相異作業之間切換的機率,而這可能會導致應用程式超過 RAM 限制。 許多 Azure 球體範例應用程式,例如 GPIO_HighLevelApp,都示範如何使用 EventLoop。
  • 避免對可在執行時間內重新計算的值使用記憶體快取。
  • 使用 libcurl 時:
    • 使用 libcurl 時,調整最大套接緩衝區大小。 Azure 球體作業系統會配置套接式緩衝區,並歸屬於您應用程式的 RAM 使用量。 縮減這些緩衝區大小是減少應用程式 RAM 應用量的好方法。 請注意,讓套接套緩衝區太小,會對 libcurl 的效能造成不良影響。 請改為針對您的案例調整最大的緩衝區大小:

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

      請參閱 CURLOPT_SOCKOPTFUNCTION libcurl 檔。

      • 較高層級 的CURLOPT_BUFFERSIZECURLOPT_UPLOAD_BUFFERSIZE 參數可以進行類似的調整。

      • Libcurl 也支援使用 curl_global_init_mem 及傳遞 、和等回撥函數來覆寫其內部記憶體函 reallocstrdupmallocfree 數。 calloc 這項功能可讓您追蹤動態配置,甚至改變行為。 例如,您可以預先配置記憶體集區,然後使用這些回撥,從該集區配置 Libcurl 記憶體。 這可以是一種有效技術,可讓您設定防護欄,並增加應用程式的確定性。 如需有關如何使用這些回撥的詳細資訊,請參閱 curl_global_init_mem 版本檔。

        注意

        此回撥機制並未涵蓋由 libcurl 造成的所有記憶體配置,僅涵蓋由 libcurl 本身直接產生的記憶體配置。 具體來說,不會追蹤由 wolfSSL 下方所做的配置。