Apakah mungkin untuk memaksakan semacam batas lunak pada konsumsi memori proses?


10

Saya rasa ini bukan masalah yang tidak biasa: satu proses mengalokasikan sejumlah besar memori (baik itu karena bug kebocoran memori, karena Anda mencoba memproses file input yang sangat besar, atau apa pun). RAM terisi, dan di beberapa titik Linux harus beralih untuk bertukar. Yah, kadang-kadang ini hanya jalan terakhir: jika saya memiliki perhitungan yang mahal, saya tidak ingin kehilangan data jika pada akhirnya saya kehabisan RAM.

Namun lebih sering (dalam pengalaman saya), konsumsi memori tidak dibatasi, oleh proses yang nakal, mungkin buggy. Yaitu, saya tidak hanya berakhir dengan beberapa data yang tidak terlalu dibutuhkan untuk dipindahkan, tetapi OS dipaksa untuk secara panik bertukar banyak data. Dan itu sayangnya tidak hanya sangat memecah proses yang menyinggung, tetapi dapat membuat seluruh sistem hampir macet (itu tidak cukup buruk lagi pada mesin dengan SSD, tapi OTOH itu membuat saya khawatir apakah menulis gigabyte dan gigabyte data sampah mungkin di jangka panjang membahayakan sel-sel flash).
Sampai saya melihat masalah dan mematikan proses secara manual (setelah itu benar-benar butuh beberapa menit sampai saya bahkan masuk ke terminal virtual!), Setengah sesi saya berjalan di swap, dan saya perlu menunggu beberapa saat sampai sistem berjalan dengan lancar lagi.

Ada satu solusi drakonik untuk masalah ini: menegakkan batas memori keras. Tetapi melakukan seluruh sistem ini kadang-kadang akan membunuh proses yang saya lebih suka masih, dan jika saya harus secara manual ulimitsebelum memulai proses menyinggung ... well, saya akan sering lupa sampai sudah terlambat.

Kemungkinan jenis solusi yang akan membuat saya lebih bahagia:

  • Jika ada proses yang melebihi penggunaan memori tertentu, proses ini secara otomatis diperlambat sehingga sistem lainnya tetap responsif.
  • Jika ada proses yang melebihi penggunaan memori tertentu, itu SIGSTOPjadi saya punya waktu untuk mencari tahu apa yang harus dilakukan selanjutnya.
  • Jika suatu proses mendekati batas RAM, saya mendapat peringatan, sebelum pertukaran besar dimulai.

Apakah ada cara untuk mendapatkan perilaku seperti itu, atau serupa?


2
Anda dapat membatasi jumlah RAM yang digunakan oleh suatu proses atau sekelompok proses, dengan menggunakan cgroup. stackoverflow.com/questions/3043709/…
Mark Plotnick

2
Ini benar-benar tepat ulimituntuk apa.
DopeGhoti

1
Ulimit -m akan digunakan, kecuali itu tidak bekerja di Linux sejak 2.4.30, dan hanya bekerja dalam situasi tertentu sebelum itu. unix.stackexchange.com/questions/129587/…
Mark Plotnick

niceload --noswap yourprg
Ole Tange

Jawaban:


6

niceload --noswap yourprg dibuat persis untuk situasi itu: Itu terlihat pada aktivitas swapping:

  • Jika bertukar: Biarkan proses berjalan
  • Jika menukar: Biarkan proses berjalan
  • Jika menukar masuk dan keluar: Menunda proses sampai bertukar berhenti dan melanjutkan proses ketika bertukar telah berhenti

Itu tidak menunda proses sebelum swapping dimulai, tetapi memungkinkan swapping berjalan selama 1 detik sebelum bertindak.

niceload --mem 1G yourprgberfungsi serupa: Jika kurang dari 1GB gratis, Anda ditangguhkan. Ketika lebih dari 1GB gratis, prog Anda dilanjutkan.


0

Iya. Ini cukup mudah dilakukan dengan hampir semua shell modern.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Anda dapat menggunakan -lopsi untuk batas memori yang terkunci. Proses Anda akan ditandai jika batas terlampaui.


-1

Cronjob untuk menghapus cache: Cara menghapus cache memori di Linux

Sebenarnya saya punya masalah serupa. Saya memiliki banyak pengguna yang menjalankan skrip khusus mereka sendiri dan sesekali skrip mereka menghabiskan semua memori yang tersedia dan menurunkan server redhat. Alasan untuk konsumsi massal RAM adalah bahwa skrip mereka dapat berjalan selama berhari-hari hanya menunggu suatu peristiwa, sehingga memonopoli sumber daya padahal kenyataannya tidak menggunakan apapun. Jadi apa yang saya lakukan hanya cukup membersihkan cache dengan cronjob dan tidak memiliki masalah sejak itu.

Sederhana dan malas.


Hm Saran yang menarik, meskipun saya khawatir itu tidak melakukan apa-apa untuk sebagian besar masalah yang saya alami. Masalah utama saya adalah dengan proses tunggal (aplikasi ilmiah) yang dapat dengan cepat mengalokasikan banyak gigabytes memori.
leftaroundabout

Cache kliring biasanya menimbulkan masalah kinerja. Sangat jarang mereka memecahkan masalah kinerja. Tetapi mereka tidak akan menyebabkan memori menjadi tersedia ketika itu tidak ada.
Gilles 'SANGAT berhenti menjadi jahat'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.