Bagikan melalui


Penggunaan memori dalam aplikasi tingkat tinggi

Penting

Ini adalah dokumentasi Azure Sphere (Warisan). Azure Sphere (Warisan) dihentikan pada 27 September 2027, dan pengguna harus bermigrasi ke Azure Sphere (Terintegrasi) saat ini. Gunakan pemilih Versi yang terletak di atas TOC untuk melihat dokumentasi Azure Sphere (Terintegrasi).

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, dicadangkan sepenuhnya 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.
  • 1 MiB memori flash baca-saja, yang dibagi antara inti tingkat tinggi dan real-time.
  • Penyimpanan baca/tulis (dapat diubah), yang bertahan saat perangkat di-boot ulang. Untuk informasi tentang penyimpanan yang dapat diubah, lihat Menggunakan penyimpanan di Azure Sphere.

Catatan

Berulang kali memperbarui flash akhirnya memakainya dan membuatnya tidak valid. Oleh karena itu, Anda harus merancang kode Anda untuk menghindari pembaruan flash yang tidak perlu. Misalnya, jika Anda ingin menyimpan status aplikasi sebelum keluar sehingga Anda dapat memulihkan status tersimpan setelah menghidupkan ulang, pertimbangkan untuk 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 mencakup metadata gambar, manifes aplikasi, dan gambar yang dapat dieksekusi. Anda tidak perlu memperhitungkan penyimpanan yang diperlukan oleh komponen yang disediakan Microsoft, seperti OS Azure Sphere 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 lengkap aplikasi Anda atau komponen yang mengaktifkan failover atau pemutaran kembali jika terjadi kerusakan atau masalah dengan pembaruan over-the-air.

Namun, selama pengembangan dan penelusuran kesalahan, ukuran debugger dihitung terhadap batas. Debugger secara otomatis ditambahkan oleh azsphere device enable-development dan dihapus oleh azsphere device enable-cloud-test. Anda dapat menemukan ukuran debugger yang digunakan oleh SDK Anda dengan mencari gdbserver.imagepackage di folder DebugTools direktori penginstalan Microsoft Azure Sphere SDK.

Perintah sideload perangkat azsphere mengembalikan kesalahan jika paket gambar aplikasi dan debugger (jika ada) melebihi batas total 1 MiB. Perintah azsphere image add --image yang mengunggah gambar baru ke penyewa Azure Sphere Anda 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 dicadangkan 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 di masa mendatang mungkin memiliki batas yang berbeda.

Kondisi kehabisan memori

Jika aplikasi Anda menggunakan terlalu banyak RAM, OS Azure Sphere mengakhirinya dengan sinyal SIGKILL. Misalnya, di debugger Anda akan melihat hal berikut:

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 saat runtime. Anda dapat menggunakan ini untuk memantau penggunaan memori aplikasi tingkat tinggi Anda, memungkinkan Anda memulai ulang aplikasi dengan aman jika penggunaan memori melebihi ambang yang Anda tentukan 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 (dalam KiB).
  • Applications_GetPeakUserModeMemoryUsageInKB: Dapatkan penggunaan memori mode pengguna puncak dalam kibibyte. Ini adalah jumlah maksimum memori pengguna yang digunakan dalam sesi saat ini. Saat menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Nilai ini direset setiap kali aplikasi Anda dimulai ulang atau disebarkan ulang. Gunakan fungsi ini untuk mendapatkan perkiraan tentang seberapa dekat aplikasi Anda mencapai batas yang direkomendasikan 256 KiB.

Untuk menggunakan fungsi-fungsi ini di aplikasi tingkat tinggi Anda, sertakan file header applications.h. Anda dapat menggunakan fungsi-fungsi ini selama pengembangan untuk mendapatkan gambaran tentang penggunaan memori aplikasi Anda secara keseluruhan, tetapi Anda juga dapat menggunakannya bersama dengan pengelogan untuk mengambil informasi dari perangkat di lapangan. Cuplikan Deteksi dan Pembersihan memori berlebihan menunjukkan cara mendeteksi dan menangani penggunaan memori yang tidak terduga.

Catatan

Fungsi-fungsi ini mengembalikan penggunaan memori seperti yang terlihat oleh OS. Saat ini, pengosongan memori oleh aplikasi untuk alokasi pada timbunan 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.

Menambahkan pelacakan alokasi memori timbunan

Anda dapat memperoleh informasi penggunaan memori tambahan dengan menambahkan pelacakan alokasi memori tumpukan, yang menunjukkan alokasi pengguna dan kernel apa yang dibuat oleh pustaka statis dan tertaut secara dinamis. Ini memberikan gambaran yang lebih lengkap tentang di mana memori digunakan oleh aplikasi Anda untuk membantu Anda menggunakannya secara paling efektif. Fitur ini, tersedia dengan OS Azure Sphere 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 timbunan berfungsi dengan benar. Jika Anda gagal melakukannya, peringatan akan dilaporkan selama kompilasi dan informasi memori timbunan tidak akan ditampilkan.

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

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

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

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

Penting

Karena pelacakan alokasi memori tumpukan hanya berfungsi pada perangkat yang mendukung pengembangan, Anda harus melakukan hal berikut untuk menghapusnya dari aplikasi Anda sebelum membangun 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 performa Visual Studio

Jika Anda 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>Profiler Performa atau tekan Alt+F2 untuk membuka jendela mulai profiler performa.

    Jendela profiler performa Visual Studio

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

  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 Penelusuran Kesalahan atau tekan Ctrl+F5 untuk menyebarkan aplikasi Anda ke perangkat.

    Penting

    Untuk mendapatkan informasi penggunaan RAM yang akurat untuk aplikasi Anda, penting bagi Anda [memulai aplikasi tanpa penelusuran kesalahan](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 meningkat, karena memori yang digunakan oleh server debugging akan disertakan dalam statistik penggunaan RAM yang dilaporkan.

Menginterpretasikan data profiler penggunaan memori

Jendela pembuatan profil penggunaan memori menampilkan tampilan seperti berikut ini:

Jendela profiler penggunaan memori Visual Studio

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

  • 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. Saat menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Memori tambahan dicadangkan untuk alokasi kernel. Nilai ini direset setiap kali aplikasi Anda dimulai ulang atau disebarkan ulang.

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

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

  • Total Heap: Total memori tumpukan 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 timbunan Visual Studio

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

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

Tip

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

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

Penggunaan memori timbunan Visual Studio tanpa kebocoran memori

Melihat statistik tentang total penggunaan memori

Perintah azsphere device app show-memory-stats mengembalikan statistik penggunaan memori pada total penggunaan memori, penggunaan mode pengguna, dan penggunaan mode pengguna puncak untuk aplikasi yang berjalan pada perangkat yang terpasang. Perangkat harus memiliki kemampuan 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 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. Saat menguji penggunaan memori aplikasi, Anda harus memastikan nilai ini tidak pernah melebihi 256 KiB. Memori tambahan dicadangkan untuk alokasi kernel. Nilai ini direset setiap kali aplikasi Anda dimulai ulang atau disebarkan ulang.

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

  • Heap: App + Static Libraries: Kernel dan alokasi pengguna dari kode Anda dan pustaka apa pun yang ditautkan secara statis ke dalamnya.
  • Heap: <alokasi> pustaka dinamis: Alokasi dari pustaka individual yang ditautkan secara dinamis yang disediakan oleh OS Azure Sphere.

Pemantauan berkelanjutan penggunaan memori

Untuk memantau penggunaan memori dari waktu ke waktu, Anda dapat menggunakan skrip untuk menjalankan perintah azsphere device app show-memory-stats dalam perulangan seperti yang dijelaskan dalam contoh berikut:

Prompt Perintah Windows

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

@echo off

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

Jalankan skrip batch dengan mengetik namanya di prompt perintah (atau jalur lengkap ke file, jika tidak ada 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 batch?".

Windows PowerShell

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

Penggunaan memori dan debugger

Saat menjalankan aplikasi Anda di bawah debugger, statistik memori yang dilaporkan juga menyertakan penggunaan memori proses server penelusuran kesalahan dan penggunaan memori tambahan lainnya yang disebabkan oleh penelusuran kesalahan, seperti mengatur titik henti. Untuk alasan ini, Anda harus selalu menjalankan aplikasi tanpa penelusuran kesalahan saat mencoba mengumpulkan statistik memori yang akurat.

Namun, menggunakan profiler penggunaan memori dapat berguna jika Anda menjalankan aplikasi dengan debugger. Mengatur titik henti 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 menelusuri kesalahan di Visual Studio, Profiler Performa terbuka secara otomatis, tetapi tidak menampilkan pelacakan alokasi memori tumpukan.