Solusi pembatasan memori untuk aplikasi serakah yang dapat merusak OS?

32

Saya menggunakan komputer saya untuk pemrograman ilmiah. Ini memiliki 8GBRAM yang sehat dan 12GBruang swap. Seringkali, karena masalah saya bertambah besar, saya melebihi semua RAM yang tersedia. Alih-alih crash (yang lebih disukai), tampaknya Ubuntu mulai memuat semuanya ke swap, termasuk Unity dan terminal terbuka apa pun. Jika saya tidak menangkap program run-away tepat waktu, tidak ada yang bisa saya lakukan selain menunggu - dibutuhkan 4-5 menit untuk beralih ke command prompt misalnya. Ctrl-Alt-F2di mana saya bisa membunuh proses yang menyinggung.

Karena kebodohan saya sendiri berada di luar jangkauan forum ini, bagaimana saya bisa mencegah Ubuntu dari crash melalui thrashing ketika saya menggunakan semua memori yang tersedia dari satu program yang menyinggung?

Eksperimen di rumah *!

Buka terminal, luncurkan pythondan jika Anda telah numpymenginstal coba ini:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Peringatan: mungkin memiliki efek buruk, memonitor proses melalui iotopatau topuntuk membunuhnya tepat waktu. Jika tidak, sampai jumpa setelah reboot.

Doyan
sumber

Jawaban:

21

Shell bawaan ulimitmemungkinkan Anda untuk membatasi sumber daya. Untuk kasus Anda, untuk membatasi penggunaan memori di shell (dan anak-anaknya), gunakan ulimit -v.

Demonstrasi menetapkan batas memori 100 MB (100000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Itu diamati menggunakan ps uww -C script-name-herepython yang membutuhkan setidaknya 29MB memori (kolom VSZ). Batas RSS bertambah saat skrip python Anda membutuhkan lebih banyak memori, jadi sesuaikan kolom itu.

Lekensteyn
sumber
1
Sayang sekali kami tidak tahu seperti apa aplikasi yang sebenarnya. Ulimit seperti yang diperlihatkan berdampak pada semua proses yang merupakan anak-anak dari cangkang itu. Kami bahkan tidak tahu apakah itu berjalan sebagai dasmon, atau jika memiliki banyak anak yang akan semakin mempersulit. Lihat coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
Apakah tidak ada front-end yang ramah pengguna untuk ulimit dan cgroup ? Di Windows, ketika OS hampir kehabisan RAM, sembulan peringatan selalu memungkinkan saya untuk menghindari pembekuan sistem. Di Ubuntu, apakah saya harus mengawasi penggunaan memori sepanjang waktu?
Dan Dascalescu
1
@DanDascalescu Jika Anda memiliki file swap yang dikonfigurasi, maka Anda akan mengalami penundaan yang lebih lama tetapi masih dapat bekerja. Setelah Anda melihat bahwa swapping dimulai, Anda dapat memeriksa monitor sistem untuk penggunaan RAM. Jika sistem Anda benar-benar kehabisan memori, pembunuh kehabisan memori (OOM) dipanggil yang membunuh proses dengan skor "kejahatan" tertinggi (biasanya proses yang menghabiskan sebagian besar memori).
Lekensteyn
12

Cgroups harus memungkinkan Anda membatasi penggunaan memori Anda pada basis per proses.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Komputasi ilmiah terkenal membutuhkan banyak memori, dengan mem-sandbox aplikasi Anda dalam cgroup, sisa proses tidak boleh menjadi korban karena tekanan memori akan berkurang.

Atau, VM dapat digunakan sebagai semacam batas keras karena aplikasi hanya dapat menggunakan memori yang didelegasikan ke mesin virtual, dengan mengorbankan kinerja tentu saja. Namun VM jauh lebih mudah untuk dikonfigurasikan untuk yang belum tahu bila dibandingkan dengan mengatur dan memelihara cgroup.

Keputusan keputusan :) Semoga beruntung!

ppetraki
sumber
1
Apakah tidak ada front-end yang ramah pengguna untuk ulimit dan cgroup? Di Windows, ketika OS hampir kehabisan RAM, sembulan peringatan selalu memungkinkan saya untuk menghindari pembekuan sistem. Di Ubuntu, apakah saya harus mengawasi penggunaan memori sepanjang waktu?
Dan Dascalescu
Nggak. OS Anda juga tidak boleh membeku, itu masalah terpisah. Jendela pop up hanyalah bandaid untuk memulai. Jika Anda menggunakan banyak memori, mungkin Anda harus menyelidiki alasannya? Sebagai contoh, browser modern dengan sanboxing mereka dapat dengan mudah mengkonsumsi 70-150M PER TAB. Mematikan atau menyetelnya dapat membebaskan memori besar yang digunakan secara teratur oleh pengguna akhir. Penjadwal seharusnya menukar program yang jarang digunakan untuk menghemat ruang tetapi jika mereka bangun lebih dari yang seharusnya maka Anda harus memperbaikinya, atau jika tugas utama Anda adalah memori intensif (web) maka diperlukan lebih banyak ram.
ppetraki
8
Saya tahu apa yang menghabiskan memori - Chrome. Tetapi OS harus melindungi kestabilannya terhadap aplikasi yang menjalankan amuk.
Dan Dascalescu
1
Saya mengerti dari mana Anda berasal sebagai pengguna. Apa yang Anda minta berarti mengubah platform komputasi umum menjadi sebuah alat. Sebagai metode yang paling tidak rumit (rawan kesalahan), seorang insinyur sistem operasi harus menerapkan untuk menyediakan perlindungan itu adalah dengan membuat keputusan yang secara dramatis beralasan tentang bagaimana seluruh komputer dijalankan. Itu biasanya datang dengan mengorbankan fleksibilitas pengguna akhir. Anda melihat contoh ini dalam komputasi tablet. Namun di desktop fleksibilitas tetap dipertahankan.
ppetraki