Praktik terbaik untuk mengelola penggunaan RAM dalam aplikasi tingkat tinggi
Meskipun AZURE Sphere OS menggunakan kernel Linux sebagai basis, penting untuk diingat bahwa Anda masih menulis aplikasi untuk perangkat yang disematkan dengan batasan RAM yang signifikan. Menerapkan praktik pemrograman yang disematkan dengan baik akan membantu Anda membuat aplikasi Azure Sphere yang andal.
Penting
Untuk mendapatkan informasi penggunaan RAM yang akurat untuk aplikasi Anda, penting bagi Anda untuk menjalankan aplikasi tanpa melakukan debugging. Menjalankan aplikasi Anda di bawah debugger akan menghasilkan penggunaan RAM yang ditingkatkan, karena RAM yang digunakan oleh server debugging akan disertakan dalam statistik penggunaan RAM yang dilaporkan. Untuk informasi selengkapnya tentang statistik memori untuk aplikasi yang berjalan pada perangkat terlampir, lihat Penggunaan memori dalam aplikasi tingkat tinggi.
Berikut adalah beberapa praktik terbaik untuk diikuti:
- Alokasikan memori di muka (idealnya statis) dan biarkan dialokasikan seumur hidup aplikasi Anda jika memungkinkan. Ini akan sangat meningkatkan determinisme penggunaan RAM aplikasi Anda, dan mengurangi risiko peningkatan jejak memori dan fragmentasi selama masa berlaku aplikasi Anda.
- Ketika alokasi dinamis mutlak diperlukan:
- Cobalah untuk meminimalkan frekuensi alokasi memori tumpukan dan deallokasi yang sedang dilakukan oleh aplikasi untuk mengurangi risiko fragmentasi memori tumpukan, misalnya, dengan memanfaatkan teknik alokasi potongan/kumpulan memori.
- Tinjau halaman tumpukan dan bila memungkinkan, bungkus
malloc()
panggilan ke dengan panggilan untukmemset()
memaksa halaman untuk dilakukan. Ini membantu memastikan bahwa jika alokasi menyebabkan aplikasi Anda melebihi batas RAM, OS akan segera mengakhirinya dan diprediksi. Menunggu untuk mengakses halaman yang dialokasikan akan menimbulkan risiko crash kehabisan memori yang tertunda, yang lebih sulit untuk direproduksi dan didiagnosis. - Aktifkan pelacakan alokasi memori heap selama dalam mode pengembangan.
- Hindari penggunaan
Log_Debug
dengan string besar dan hapus panggilan ini (misalnya, dengan )#ifdef
ketika tidak dalam mode pengembangan.Log_Debug
menyebabkan buffer sementara dialokasikan, yang mengakibatkan ledakan tiba-tiba dalam penggunaan RAM ketika digunakan dengan string besar. - Gunakan API EventLoop jika memungkinkan untuk tugas asinkron berkala (seperti berinteraksi dengan periferal) dan bukan membuat utas. Membuat utas menyebabkan kernel Linux mengalokasikan memori tambahan yang dikaitkan dengan aplikasi Anda. Ini mengurangi determinisme aplikasi Anda karena meningkatkan probabilitas penjadwal OS beralih antara beberapa operasi berbeda yang dapat menyebabkan aplikasi Anda melebihi batas RAM. Banyak aplikasi Sampel Azure Sphere, seperti GPIO_HighLevelApp, menunjukkan cara menggunakan EventLoop.
- Hindari penggunaan cache memori prematur untuk nilai yang dapat dikomcomputasikan ulang dalam runtime.
- Saat menggunakan libcurl:
Menyempurnakan ukuran buffer soket maks saat menggunakan libcurl. Azure Sphere OS akan mengalokasikan buffer soket yang dikaitkan dengan penggunaan RAM aplikasi Anda. Mengurangi ukuran buffer ini bisa menjadi cara yang baik untuk mengurangi jejak RAM aplikasi Anda. Perhatikan bahwa membuat buffer soket terlalu kecil akan berdampak buruk pada kinerja libcurl. Sebagai gantinya, sesuaikan ukuran maksimum buffer untuk skenario Anda:
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);
Lihat dokumentasi libcurl CURLOPT_SOCKOPTFUNCTION .
Parameter CURLOPT_BUFFERSIZE dan CURLOPT_UPLOAD_BUFFERSIZE tingkat yang lebih tinggi dapat disetel sama.
Libcurl juga mendukung pengesampingan fungsi memori internalnya dengan menggunakan
curl_global_init_mem
dan masuk dalam fungsi callback untukmalloc
, ,free
,realloc
,strdup
, dancalloc
. Fungsionalitas ini memungkinkan Anda untuk melacak alokasi dinamis atau bahkan mengubah perilaku. Misalnya, Anda dapat mengalokasikan kumpulan memori di muka, lalu menggunakan callback ini untuk mengalokasikan memori libcurl dari kumpulan tersebut. Ini bisa menjadi teknik yang efektif untuk mengatur pagar pembatas dan meningkatkan determinisme aplikasi Anda. Lihat dokumentasi libcurl curl_global_init_mem untuk informasi selengkapnya tentang cara menggunakan callback ini.Catatan
Mekanisme callback ini tidak mencakup semua alokasi memori yang disebabkan oleh libcurl, hanya yang dibuat langsung oleh libcurl itu sendiri. Secara khusus, alokasi yang dibuat oleh serigalaSSL di bawahnya tidak terlacak.