Aracılığıyla paylaş


Üst düzey uygulamalarda RAM kullanımını yönetmek için en iyi yöntemler

Azure Sphere işletim sistemi linux çekirdeğini temel olarak kullansa da, önemli RAM kısıtlamaları olan ekli bir cihaz için uygulama yazmaya devam ettiğinizi unutmayın. İyi tümleşik programlama uygulamaları uygulamak, güvenilir Azure Sphere uygulamaları oluşturmanıza yardımcı olur.

Önemli

Uygulamanız için doğru RAM kullanım bilgilerini almak için uygulamanızı hata ayıklamadan çalıştırmanız önemlidir. Hata ayıklama sunucusu tarafından tüketilen RAM bildirilen RAM kullanım istatistiklerine dahil edildiğinden uygulamanızı hata ayıklayıcının altında çalıştırmak, ram kullanımının şişirilmesine neden olur. Ekli cihazda çalışan uygulamanın bellek istatistikleri hakkında daha fazla bilgi için bkz. Üst düzey uygulamalarda bellek kullanımı.

İzleyebileceğiniz en iyi uygulamalardan bazıları şunlardır:

  • Belleği önceden (ideal olarak statik olarak) ayırın ve mümkün olduğunda uygulamanızın ömrü için ayrılmış olarak bırakın. Bu, uygulamanızın RAM kullanımının belirleyiciliğini büyük ölçüde artırır ve uygulamanızın ömrü boyunca bellek ayak izi artışları ve parçalanma riskini azaltır.
  • Dinamik ayırma kesinlikle gerekli olduğunda:
    • Öbek ayırma/bellek havuzu tekniklerinden yararlanarak yığın belleği parçalanma risklerini azaltmak için uygulama tarafından gerçekleştirilen yığın bellek ayırmalarının ve serbest bırakma işlemlerinin sıklığını en aza indirmeyi deneyin.
    • Yığın sayfalarını gözden geçirin ve mümkün olduğunda, sayfaları işlemeye malloc() zorlamak için memset() çağrıları ile sarmala. Bu, bir ayırma uygulamanızın RAM sınırını aşmasına neden olursa işletim sisteminin bunu hemen ve tahmin edilebilir bir şekilde sonlandırmasını sağlamaya yardımcı olur. Ayrılan sayfalara erişmek beklenirse gecikmeli yetersiz bellek kilitlenmesi riski ortaya çıkar ve bu da yeniden oluşturmak ve tanılamak için daha zordur.
    • Geliştirme modundayken yığın bellek ayırma izlemeyi etkinleştirin.
  • Geliştirme modunda değilken büyük dizelerle kullanmaktan Log_Debug kaçının ve bu çağrıları kaldırın (örneğin, bir #ifdefile). Log_Debug geçici arabelleklerin ayrılmasına neden olur ve büyük dizelerle kullanıldığında RAM kullanımında ani artışlara neden olur.
  • İş parçacıkları oluşturmak yerine düzenli aralıklarla zaman uyumsuz görevler (çevre birimleriyle etkileşim kurma gibi) için mümkün olduğunda EventLoop API'sini kullanın. İş parçacıkları oluşturmak, Linux çekirdeğinin uygulamanıza öznitelikli ek bellek ayırmasına neden olur. Bu, işletim sistemi zamanlayıcısının uygulamanızın RAM sınırını aşmasına neden olabilecek birden çok farklı işlem arasında geçiş yapma olasılığını artırdığı için uygulamanızın determinizmini azaltır. GPIO_HighLevelApp gibi Azure Sphere Örnek uygulamalarının çoğu EventLoop'un nasıl kullanılacağını gösterir.
  • Çalışma zamanında yeniden hesaplanabilir değerler için bellek önbelleklerinin erken kullanımından kaçının.
  • Libcurl kullanırken:
    • Libcurl kullanırken en yüksek yuva arabellek boyutlarını ayarlayın. Azure Sphere işletim sistemi, uygulamanızın RAM kullanımıyla ilişkilendirilen yuva arabellekleri ayırır. Bu arabellek boyutlarını azaltmak, uygulamanızın RAM ayak izini azaltmanın iyi bir yolu olabilir. Yuva arabelleklerinin çok küçük olması libcurl performansını olumsuz yönde etkiler. Bunun yerine, senaryonuz için en yüksek arabellek boyutlarını ayarlayı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);
      

      CURLOPT_SOCKOPTFUNCTION libcurl belgelerine bakın.

      • Üst düzey CURLOPT_BUFFERSIZE ve CURLOPT_UPLOAD_BUFFERSIZE parametreleri benzer şekilde ayarlanabilir.

      • Libcurl ayrıca , , free, strduprealloccallocve için mallocgeri çağırma işlevlerini kullanarak curl_global_init_mem ve geçirerek iç bellek işlevlerini geçersiz kılmayı da destekler. Bu işlev, dinamik ayırmaları izlemenize ve hatta davranışı değiştirmenize olanak tanır. Örneğin, önceden bir bellek havuzu ayırabilir ve ardından bu geri çağırmaları kullanarak bu havuzdan libcurl belleği ayırabilirsiniz. Bu, korumaları ayarlamak ve uygulamanızın determinizmini artırmak için etkili bir teknik olabilir. Bu geri çağırmaları kullanma hakkında daha fazla bilgi için curl_global_init_mem libcurl belgelerine bakın.

        Not

        Bu geri çağırma mekanizması, libcurl'un neden olduğu tüm bellek ayırmalarını kapsamaz, yalnızca doğrudan libcurl tarafından yapılanları kapsar. Özellikle, altında wolfSSL tarafından yapılan ayırmalar izlenmez.