Ada banyak pertanyaan dan jawaban tentang membatasi sumber daya dari satu proses, misalnya RLIMIT_AS dapat digunakan untuk membatasi memori maksimum yang dialokasikan oleh suatu proses yang dapat dilihat sebagai VIRT pada suka top
. Lebih lanjut tentang topik misalnya di sini. Apakah ada cara untuk membatasi jumlah memori proses tertentu dapat digunakan di Unix?
setrlimit(2)
dokumentasi mengatakan:
Proses anak yang dibuat melalui fork (2) mewarisi batasan sumber daya orang tuanya. Batas sumber daya dipertahankan di seluruh eksekutif (2).
Ini harus dipahami dengan cara berikut:
Jika suatu proses memiliki RLIMIT_AS misalnya 2GB, maka itu tidak dapat mengalokasikan lebih banyak memori dari 2GB. Ketika memunculkan anak, batas ruang alamat 2GB akan diteruskan ke anak, tetapi penghitungan dimulai dari 0. Kedua proses tersebut secara bersamaan dapat memakan memori hingga 4GB.
Tetapi apa cara yang bermanfaat untuk membatasi jumlah total memori yang dialokasikan oleh seluruh pohon proses?
Jawaban:
Saya tidak yakin apakah ini menjawab pertanyaan Anda, tetapi saya menemukan ini skrip perl yang mengklaim melakukan persis apa yang Anda cari. Script mengimplementasikan sistemnya sendiri untuk menegakkan batas dengan bangun dan memeriksa penggunaan sumber daya proses dan anak-anaknya. Tampaknya telah didokumentasikan dengan baik dan dijelaskan, dan telah diperbarui baru-baru ini.
Seperti yang dikatakan slm dalam komentarnya, cgroup juga dapat digunakan untuk ini. Anda mungkin harus menginstal utilitas untuk mengelola cgroup, dengan asumsi Anda menggunakan Linux yang harus Anda cari
libcgroups
.Pastikan
$USER
pengguna Anda.Pengguna Anda kemudian harus memiliki akses ke pengaturan memori cgroup di
/sys/fs/cgroup/memory/myGroup
.Anda kemudian dapat menetapkan batas menjadi, katakanlah 500 MB, dengan melakukan ini:
Sekarang mari kita jalankan Vim:
Proses vim dan semua anak-anaknya sekarang harus dibatasi untuk menggunakan 500 MB RAM. Namun , saya pikir batas ini hanya berlaku untuk RAM dan bukan swap. Setelah proses mencapai batas mereka akan mulai bertukar. Saya tidak yakin apakah Anda dapat menyiasati hal ini, saya tidak dapat menemukan cara untuk membatasi penggunaan swap menggunakan cgroup.
sumber
sudo yum install libcgroup-tools
Saya membuat skrip yang melakukan ini, menggunakan cgmanager yang digunakan di Ubuntu. Satu keuntungan adalah bahwa ini tidak memerlukan akses root. Perhatikan bahwa manajemen cgroup sedikit spesifik untuk distro, jadi saya tidak tahu apakah ini berfungsi pada distro yang menggunakan manajemen cgroup systemd.
penggunaan: simpan seperti
limitmem
di jalur Anda dan membuatnya dapat dieksekusi Kemudian jalankan mislimitmem 1G command...
. Ini membatasi memori yang sebenarnya digunakan. Jika itu tercapai, pembunuh OOM akan membunuh proses atau salah satu dari anak-anaknya, tetapi bukan sesuatu yang acak yang tidak ada hubungannya dengan perintah ini.sumber
cgm
panduan singkatnya , ini berguna/unix//a/536046/4319 :
Pada setiap distro berbasis systemd Anda juga dapat menggunakan cgroup secara tidak langsung melalui systemd-run. Misalnya untuk kasus Anda membatasi
pdftoppm
500M RAM, gunakan:...
sumber