Bagikan melalui


Penggunaan memori dalam aplikasi tingkat tinggi

Topik ini menyediakan detail tentang penggunaan memori dalam aplikasi tingkat tinggi. Lihat Mengelola pertimbangan memori dan latensi untuk informasi tentang memori yang tersedia untuk aplikasi berkemampuan real-time (RTApps).

Aplikasi tingkat tinggi memiliki akses ke memori dan penyimpanan berikut:

  • RAM 256 KiB pada inti tingkat tinggi, sepenuhnya dipesan untuk penggunaan aplikasi tingkat tinggi. Hingga 1 KiB ruang ini dapat dialokasikan untuk setiap saluran buffer bersama di mana aplikasi tingkat tinggi dan RTApps berkomunikasi.
  • Memori flash baca-saja 1 MiB, yang dibagikan antara inti tingkat tinggi dan real-time.
  • Penyimpanan baca/tulis (mutable), yang tetap ada saat perangkat melakukan boot ulang. Untuk informasi tentang penyimpanan yang dapat dibisukan, lihat Menggunakan penyimpanan di Azure Sphere.

Catatan

Berulang kali memperbarui flash akhirnya memakainya dan membuatnya tidak valid. Oleh karena itu, Anda harus mendesain kode Anda untuk menghindari pembaruan flash yang tidak diperlukan. Misalnya, jika Anda ingin menyimpan status aplikasi Anda sebelum keluar sehingga Anda bisa memulihkan status yang disimpan setelah restart, pertimbangkan menyimpan status aplikasi ke flash hanya jika status telah berubah.

Menentukan penggunaan memori flash

Untuk menentukan penggunaan memori flash Anda, pertimbangkan hanya ukuran file paket gambar yang menyertakan metadata gambar, manifes aplikasi, dan gambar yang dapat dijalankan. Anda tidak perlu memperhitungkan penyimpanan yang diperlukan oleh komponen yang disediakan Microsoft, seperti Azure Sphere OS atau layanan run-time dan pustaka bersama yang mengontrol periferal dan mengaktifkan koneksi ke Azure IoT Hub. Demikian juga, Anda tidak perlu menyertakan ukuran salinan cadangan penuh aplikasi Anda atau komponen yang mengaktifkan failover atau rollback jika terjadi kerusakan atau masalah dengan pembaruan over-the-air.

Namun, selama pengembangan dan debugging, ukuran debugger tidak dihitung terhadap batas. Debugger secara otomatis ditambahkan oleh az sphere device enable-development dan dihapus oleh [az sphere device enable-cloud-test](.. /reference/az sphere-device.md). Anda dapat menemukan ukuran debugger yang digunakan oleh SDK dengan mencari gdbserver.imagepackage dalam folder DebugTools direktori penginstalan Microsoft Azure Sphere SDK.

Perintah muat sisi perangkat bola az mengembalikan kesalahan jika paket gambar aplikasi dan debugger (jika ada) melebihi batas total 1 MiB. Perintah tambahkan gambar bola az --image yang mengunggah gambar baru ke katalog Azure Sphere juga mengembalikan kesalahan jika paket gambar melebihi 1 MiB.

Batas RAM 256 KiB berlaku untuk aplikasi saja; Anda tidak perlu mengizinkan RAM yang digunakan oleh debugger. Memori tambahan disediakan untuk alokasi kernel.

Flash dan RAM yang tersedia dapat meningkat (tetapi tidak akan pernah berkurang) untuk aplikasi yang ditulis untuk chip Azure Sphere saat ini (MT3620). Chip Azure Sphere yang akan datang mungkin memiliki batas yang berbeda.

Kondisi memori habis

Jika aplikasi Anda menggunakan terlalu banyak RAM, AZURE Sphere OS mengakhirinya dengan sinyal SIGKILL. Misalnya, dalam debugger, Anda akan melihat yang berikut ini:

Child terminated with signal = 0x9 (SIGKILL)

Sinyal SIGKILL juga terjadi jika aplikasi tingkat tinggi gagal keluar setelah menerima permintaan SIGTERM. Lihat Siklus hidup aplikasi untuk detailnya.

Untuk membantu menghindari crash di aplikasi Anda karena kondisi kehabisan memori, lihat praktik terbaik untuk mengelola penggunaan RAM dalam aplikasi tingkat tinggi.

Menentukan penggunaan RAM aplikasi run-time

Azure Sphere menyediakan beberapa fungsi untuk mendapatkan informasi penggunaan memori pada runtime. Anda dapat menggunakannya untuk memantau penggunaan memori aplikasi tingkat tinggi, yang memungkinkan Anda untuk memulai ulang aplikasi dengan aman jika penggunaan memori melebihi ambang batas yang ditentukan dalam batas 256 KiB. Fungsi yang tersedia adalah:

  • Applications_GetTotalMemoryUsageInKB: Dapatkan total penggunaan memori dalam kibibyte. Ini adalah total penggunaan memori fisik aplikasi Anda pada sistem, termasuk alokasi kernel (seperti buffer untuk soket) atas nama aplikasi Anda atau server debugging, dikembalikan sebagai nilai mentah (di KiB).
  • Applications_GetUserModeMemoryUsageInKB: Dapatkan penggunaan memori mode pengguna dalam kibibyte. Ini adalah jumlah memori fisik yang digunakan langsung oleh aplikasi Anda, memori yang digunakan oleh pustaka apa pun atas namanya (juga disebut sebagai alokasi anon ), dan memori yang digunakan oleh server debugging, dikembalikan sebagai nilai mentah (di KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Dapatkan penggunaan memori mode pengguna puncak dalam kibibyte. Ini adalah jumlah maksimum memori pengguna yang digunakan dalam sesi saat ini. Ketika menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Nilai ini direset setiap kali aplikasi dimulai ulang atau dieploy ulang. Gunakan fungsi ini untuk mendapatkan perkiraan seberapa dekat aplikasi Anda mencapai batas yang direkomendasikan 256 KiB.

Untuk menggunakan fungsi ini di aplikasi tingkat tinggi Anda, sertakan file header applications.h. Anda dapat menggunakan fungsi ini selama pengembangan untuk mendapatkan gambaran tentang keseluruhan penggunaan memori aplikasi, tetapi Anda juga dapat menggunakannya bersama-sama dengan pembuatan log untuk merekam informasi dari perangkat di bidang tersebut. Potongan Deteksi overuse Memori dan Pembersihan menunjukkan cara mendeteksi dan menangani penggunaan memori yang tidak terduga dengan anggun.

Catatan

Fungsi ini mengembalikan penggunaan memori seperti yang terlihat oleh OS. Saat ini, pengosongan memori oleh aplikasi untuk alokasi pada tumpukan pengguna tidak dilaporkan oleh fungsi-fungsi ini. Memori akan dikembalikan ke pustaka malloc untuk digunakan di masa mendatang tetapi statistik yang dilaporkan oleh OS tetap tidak berubah kecuali memori dialokasikan dan dibebaskan oleh OS itu sendiri. Contohnya adalah mengalokasikan memori untuk soket. Oleh karena itu, fungsi-fungsi ini berguna untuk memahami skenario terburuk untuk membantu aplikasi Anda beroperasi secara konservatif untuk keandalan maksimum. Nilai adalah perkiraan dan dapat bervariasi di seluruh versi OS.

Tambahkan pelacakan alokasi memori heap

Anda dapat memperoleh informasi penggunaan memori tambahan dengan menambahkan pelacakan alokasi memori tumpukan, yang memperlihatkan alokasi pengguna dan kernel yang dibuat oleh pustaka statis dan tertaut secara dinamis. Ini memberikan gambaran yang lebih lengkap tentang di mana memori sedang digunakan oleh aplikasi Anda untuk membantu Anda menggunakannya secara paling efektif. Fitur ini, tersedia dengan Azure Sphere OS versi 21.07 atau yang lebih baru dan versi runtime aplikasi (ARV) 10 atau yang lebih baru, hanya berfungsi pada perangkat yang mendukung pengembangan dan hanya ketika aplikasi tidak berjalan di bawah debugger.

Catatan

Anda harus menyelesaikan kedua tugas konfigurasi yang dijelaskan di bagian ini agar pelacakan alokasi memori heap berfungsi dengan benar. Jika Anda gagal melakukannya, peringatan akan dilaporkan selama kompilasi dan informasi memori tumpukan tidak akan ditampilkan.

Untuk mengaktifkan pelacakan alokasi memori tumpukan, Anda perlu melakukan dua hal:

  • Tambahkan kapabilitas HeapMemStats ke file app-manifest.json aplikasi Anda:

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • Tambahkan pustaka libmalloc ke paket gambar Anda dengan menambahkan DEBUG_LIB "libmalloc" perintah dalam azsphere_target_add_image file CMakeLists.txt aplikasi Anda:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Penting

Karena pelacakan alokasi memori heap hanya berfungsi pada perangkat yang mendukung pengembangan, Anda harus melakukan hal berikut ini untuk menghapusnya dari aplikasi Anda sebelum membuat paket gambar untuk penyebaran:

  • Hapus baris '"HeapMemStats": true' dari file app-manifest.json aplikasi Anda.
  • Hapus DEBUG_LIB "libmalloc" dari azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" perintah dalam file CMakeLists.txt aplikasi Anda.

Menggunakan profiler kinerja Visual Studio

Jika menggunakan Visual Studio, Anda dapat menggunakan fitur profiler performanya untuk mendapatkan informasi tentang penggunaan memori aplikasi. Untuk tutorial yang menggunakan profiler ini, lihat Tutorial/MemoryUsage.

Prasyarat

Memulai profiler penggunaan memori

  1. Pilih Debug>Performance Profiler atau tekan Alt+F2 untuk membuka jendela mulai performance profiler.

    Jendela profiler kinerja Visual Studio

  2. Di bawah Target Analisis, jika Azure Sphere Device Profiler tidak terlihat, pilih Pilih Target dan pilih Azure Sphere Device Profiler.

  3. Di bawah Alat yang Tersedia, pastikan Penggunaan Memori Azure Sphere dicentang, lalu pilih Mulai untuk membuka jendela pembuatan profil penggunaan memori dan memulai profiler memori.

  4. Jika Anda perlu menyebarkan atau memulai ulang aplikasi, pilih Debug>Mulai Tanpa Debugging atau tekan Ctrl+F5 untuk menyebarkan aplikasi Anda ke perangkat.

    Penting

    Untuk mendapatkan informasi penggunaan RAM yang akurat untuk aplikasi Anda, penting bagi Anda untuk [memulai aplikasi tanpa debugging](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). Menjalankan aplikasi Anda di bawah debugger akan mengakibatkan penggunaan RAM yang ditingkatkan, karena memori yang digunakan oleh server debugging akan disertakan dalam statistik penggunaan RAM yang dilaporkan.

Menginterpretasikan data profiler penggunaan memori

Jendela profil penggunaan memori menampilkan tampilan seperti berikut:

Jendela profiler penggunaan memori Visual Studio

Di tengah tampilan, grafik Memori Fisik Perangkat Azure Sphere memplok tiga statistik penggunaan RAM yang berbeda (diperlihatkan ke KiB terdekat) sebagai tiga baris berbeda saat aplikasi Anda menjalankan:

  • Total: Total penggunaan memori fisik aplikasi Anda pada sistem, termasuk alokasi kernel (seperti buffer untuk soket) atas nama aplikasi Anda atau server debugging.
  • Pengguna: Jumlah memori fisik yang digunakan langsung oleh aplikasi Anda, memori yang digunakan oleh pustaka apa pun atas namanya (juga disebut sebagai alokasi anon ), dan memori yang digunakan oleh server debugging.
  • Pengguna Puncak: Jumlah maksimum memori pengguna yang digunakan dalam sesi saat ini. Ketika menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Memori tambahan disediakan untuk alokasi kernel. Nilai ini direset setiap kali aplikasi dimulai ulang atau dieploy ulang.

Grafik juga memplangkas kemunculan acara Puncak Baru (diwakili oleh segitiga). Kejadian ini terjadi setiap kali ada maksimum baru untuk penggunaan memori Pengguna Puncak. Acara diaktifkan untuk aksesibilitas pembaca layar.

Jika Anda telah mengaktifkan pelacakan alokasi memori heap dan aplikasi Anda tidak berjalan di bawah debugger, Anda akan melihat grafik tambahan yang memperlihatkan statistik memori tumpukan:

  • Total Heap: Total heap memory yang dialokasikan oleh atau atas nama aplikasi Anda, termasuk dari pustaka statis dan dinamis.
  • Shared Library Heap: Alokasi dari pustaka yang ditautkan secara dinamis yang disediakan oleh Azure Sphere OS.

Penggunaan memori tumpukan Visual Studio

Di atas grafik, tampilan garis waktu menampilkan waktu proses aplikasi Anda, yang berkorelasi dengan data pada grafik di bawah ini. Gunakan Perbesar dan Perkecil untuk fokus pada periode waktu tertentu.

Di bawah grafik, tampilan tabel menampilkan statistik memori dan kejadian yang sama.

Tips

Untuk menyalin data dari tabel ke clipboard, tekan Ctrl+A untuk memilih semua baris lalu tekan Ctrl+C.

Dua grafik pertama yang diperlihatkan di bagian ini diambil saat menjalankan Tahap 1 tutorial Penggunaan Memori, yang berisi kebocoran memori. Penggunaan memori memanjat secara monoton di setiap grafik, memberikan bukti visual untuk kebocoran. Ketika kebocoran diperbaiki, seperti dalam Tahap 2 tutorial Penggunaan Memori, grafik naik dan turun saat memori dialokasikan dan ditangani.

Penggunaan memori tumpukan Visual Studio tanpa kebocoran memori

Lihat statistik penggunaan memori total

Perintah show-memory-stats aplikasi perangkat bola az mengembalikan statistik penggunaan memori pada total penggunaan memori, penggunaan mode pengguna, dan penggunaan mode pengguna puncak untuk aplikasi yang berjalan pada perangkat yang dilampirkan. Perangkat harus memiliki kapabilitas perangkat appDevelopment yang dikonfigurasi untuk menjalankan perintah ini.

Statistik penggunaan RAM yang ditampilkan saat aplikasi Anda berjalan adalah:

  • Total (Kernel + Mode Pengguna): Total penggunaan memori fisik aplikasi Anda pada sistem, termasuk alokasi kernel (seperti buffer untuk soket) atas nama aplikasi Anda atau server debugging.
  • Mode Pengguna: Jumlah memori fisik yang digunakan secara langsung oleh aplikasi Anda, memori yang digunakan oleh pustaka apa pun atas namanya (juga disebut sebagai alokasi anon ), dan memori yang digunakan oleh server debugging.
  • Mode Pengguna Puncak: Jumlah maksimum memori pengguna yang digunakan dalam sesi saat ini. Ketika menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Memori tambahan disediakan untuk alokasi kernel. Nilai ini direset setiap kali aplikasi dimulai ulang atau dieploy ulang.

Jika Anda telah mengaktifkan pelacakan alokasi memori heap dan aplikasi Anda tidak berjalan di bawah debugger, Anda akan melihat baris statistik memori tumpukan tambahan:

  • Heap: App + Static Libraries: The kernel and user allocations from your code and any libraries statically linked to it.
  • Heap: <alokasi> pustaka dinamis: Alokasi dari pustaka individual yang ditautkan secara dinamis yang disediakan oleh Azure Sphere OS.

Pemantauan berkelanjutan penggunaan memori

Untuk memantau penggunaan memori seiring waktu, Anda dapat menggunakan skrip untuk menjalankan [az sphere device app show-memory-stats](.. perintah /reference/az sphere-device.md) dalam pengulangan seperti yang dijelaskan dalam contoh berikut:

Prompt Perintah Windows

Menggunakan Notepad atau editor teks lain, buat file skrip kumpulan memuse.bat dengan konten berikut:

@echo off

:loop
call az sphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop

Jalankan skrip kumpulan dengan mengetikkan namanya di prompt perintah (atau jalur lengkap ke file, jika tidak berada di direktori saat ini):

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

Untuk keluar dari skrip, ketik Ctrl+C di jendela Prompt Perintah , lalu jawab Y ke perintah "Hentikan pekerjaan kumpulan?".

Windows PowerShell

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

Penggunaan memori dan pen-debugger

Saat menjalankan aplikasi Anda di bawah debugger, statistik memori yang dilaporkan juga menyertakan penggunaan memori proses server debugging dan penggunaan memori tambahan lainnya yang disebabkan oleh proses debug, seperti pengaturan titik pecah. Untuk alasan ini, Anda harus selalu menjalankan aplikasi tanpa melakukan debugging ketika mencoba mengumpulkan statistik memori yang akurat.

Namun, menggunakan profiler penggunaan memori dapat berguna jika Anda menjalankan aplikasi dengan debugger. Mengatur titik hentian dan melangkah melalui baris kode sambil mengamati perubahan relatif dalam konsumsi memori dapat menjadi teknik yang berguna untuk mengidentifikasi penyebab lonjakan penggunaan memori atau kebocoran memori.

Saat melakukan debug di Visual Studio, Performance Profiler terbuka secara otomatis, tetapi tidak menampilkan pelacakan alokasi memori tumpukan.