Di Windows 8.1, apakah ada cara untuk memastikan proses bukan yang pertama terbunuh saat kehabisan RAM?

18

Saya menulis aplikasi .NET 4.5 yang mendukung data warna, inframerah, dan kedalaman dari Kinect v2, melakukan beberapa pemrosesan di atasnya, dan kemudian membuangnya ke disk, dalam bentuk yang tidak terkompresi; aplikasi .NET juga memulai ffmpeg sebagai subproses dan mem-pipe data warna untuk disandikan sebagai H.264.

Karena saya tidak menggunakan SSD, data video tiba lebih cepat daripada yang saya bisa tulis ke disk. Tapi tidak apa-apa, saya bisa membuang bingkai video ketika saya kekurangan RAM. Satu-satunya persyaratan saya adalah bahwa apa pun yang saya simpan sebagian besar bersebelahan 8--10 detik video. Jadi saya telah menambahkan beberapa logika dalam aplikasi .NET 4.5 saya untuk mulai membuang bingkai video ketika saya tidak memiliki cukup RAM untuk buffer berdampingan 8 hingga 10 detik video (sekitar 1,5 hingga 2 GB).

Dan, untuk mencegah meronta-ronta halaman, saya telah sepenuhnya menonaktifkan file paging. Ini membuat saya dengan total 16 GB RAM fisik.

Masalah saya adalah bahwa bahkan dengan mekanisme itu di tempat, kadang-kadang aplikasi .NET saya atau subproses ffmpeg masih terbunuh ketika Windows 8.1 panik tentang RAM yang rendah, karena jelas aplikasi saya menggunakan sebagian besar RAM ketika memiliki tumpukan besar data video untuk menulis ke disk. Apakah ada cara untuk memberi tahu Windows bahwa proses saya lebih penting daripada yang lain sehingga Windows akan mulai membunuh proses yang kurang penting lainnya terlebih dahulu?

Kal
sumber
10
Saya tidak berpikir windows membunuh proses, saya pikir itu hanya fitur linux.
Scott Chamberlain
4
@ScottChamberlain: Itu karena mematikan file halaman pada Windows sangat jarang. Ini memberi Anda semua jenis perilaku tak terduga dan tidak biasa. Jawaban yang jelas di sini adalah "jangan mematikan file paging; yang memaksa Windows untuk menyimpan data yang tidak digunakan dalam RAM sehingga aplikasi Anda tidak dapat menggunakan RAM itu"
MSalters
1
Jika ini adalah pertanyaan StackOverflow, saya bisa mengarahkan Anda ke CreateMemoryResourceNotificationyang jauh lebih sedikit peretasan.
MSalters
7
@ Kal: Jika akses disk adalah hambatan, gunakan kompresi yang lebih kuat, jika CPU adalah hambatan, gunakan kompresi yang lebih cepat. Jika keduanya merupakan hambatan, pikirkan kembali seluruh desain Anda dan mulai lagi dari awal, atau dapatkan perangkat keras yang lebih baik.
Mooing Duck
1
@FactorMystic OMG dia melakukan apa? Menonaktifkan file halaman akan mengurangi RAM Anda yang dapat digunakan secara signifikan.
Aron

Jawaban:

45

Windows tidak mematikan proses ketika semua RAM digunakan. Apa yang sebenarnya terjadi adalah bahwa proses gagal mengalokasikan memori dan kerusakan.

Ini terjadi karena semua memori fisik Anda sedang digunakan dan karena file halaman dinonaktifkan, manajer memori tidak lagi memiliki kemampuan untuk menulis halaman yang tidak digunakan. Ini membuat RAM fisik Anda penuh dan ketika proses Anda, atau apa pun yang lain berjalan pada saat itu, mencoba mengalokasikan halaman, itu gagal. Beberapa aplikasi mogok.

Presentasi dari Technet ini menjelaskan: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Pagefile menjaga aplikasi agar tidak mogok saat Anda menggunakan semua memori Anda dengan bertindak sebagai penghalang bagi komitmen berlebihan.

Memori virtual adalah dasar dari bagaimana sistem operasi modern mengalokasikan sumber daya, jadi itu semua tentang memiliki hal-hal dalam RAM yang sedang digunakan, dan memindahkan barang masuk dan keluar dari disk.

Sebenarnya hanya ada dua jawaban:

  1. Aktifkan kembali pagefile dan tambah RAM di komputer Anda untuk mengurangi disk drive.
  2. Kurangi persyaratan memori aplikasi Anda.

Intinya adalah bahwa RAM hanyalah tingkat cache yang lain, dan semua hal tentang memori virtual, pagefiles, file yang dipetakan memori, dan semua yang pada dasarnya bermuara pada ini: jika Anda kehabisan memori, Anda perlu menambahkan lebih.

Dawn Benton
sumber
4
Atau gunakan lebih sedikit ....
nhgrif
1
Harap dicatat bahwa tumpukan sedang menumpuk karena data tidak dapat ditulis ke disk cukup cepat. Saya tidak berpikir bahwa mengaktifkan memori virtual pada disk yang sama dapat membantu di sana ...
Alexander
3
Bahkan, file halaman akan berada di tempat lain di disk. Dan karena kita tahu ini bukan SSD, itu berarti pencarian fisik yang merupakan operasi disk paling lambat.
MSalters
9
Kedengarannya seperti Anda memerlukan manajemen memori eksplisit dalam aplikasi Anda kemudian ...
Joe
1
@Sampai ini persisnya. Pengumpul sampah akan membuat manajemen memori mimpi buruk dalam situasi seperti ini. Jenis situasi ini sepele bagi saya untuk berurusan dengan di C ++ karena saya memiliki kontrol yang baik untuk semua penggunaan memori. Meskipun ada pola desain yang akan berfungsi dengan baik untuk kasus ini di C # juga, itu tidak sesederhana apa yang kebanyakan orang akan coba.
Thebluefish
0

Buka Panel Alat Windows & Pengaturan Lanjut & nonaktifkan hal-hal yang tidak diperlukan, seperti efek jendela jika Anda belum melakukannya, dan dapatkan Sysinternals Process Explorer & / atau Monitor Sistem untuk menemukan & mematikan segala hal asing yang menghabiskan CPU atau memori.

Lebih penting lagi, gunakan Process Explorer & / atau System Monitor untuk menonton ketika program Anda dieksekusi dan lihat di mana & bagaimana ia gagal. Utas mana yang kehabisan memori dan mati lebih dulu - prgm utama atau bagian ffmpeg? Apakah ada dll tertentu atau sumber daya bersama lainnya yang ukuran balonnya tidak terduga? Atau apakah eksekusi berjalan dengan benar, kecuali menggigit lebih dari yang bisa dikunyah dalam data?

Mencari tahu lebih tepat sifat masalah Anda kemungkinan akan mengarahkan Anda ke arah solusi. Anda bisa, misalnya, menerapkan kebijakan menjatuhkan bingkai Anda lebih agresif, sambil mengoptimalkan lebih baik untuk kriteria chunk 8-10 detik Anda untuk mencapai overhead RAM keseluruhan yang lebih rendah

Saran terakhir: Mungkin pertimbangkan untuk beralih ke Linux, dan sementara itu, aktifkan kembali file paging (linux menyebutnya ruang swap, yang membuatnya terdengar lebih menyenangkan, seperti swap-meet atau semacamnya!) Semoga beruntung.

NS-MoCompSvc
sumber