Cara lain untuk membatasi ini adalah dengan menggunakan grup kontrol Linux. Ini sangat berguna jika Anda ingin membatasi alokasi memori fisik proses (atau kelompok proses) secara jelas dari memori virtual. Misalnya:
cgcreate -g memory:myGroup
echo 500M > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
echo 5G > /sys/fs/cgroup/memory/myGroup/memory.memsw.limit_in_bytes
akan membuat grup kontrol bernama myGroup
, tutup kumpulan proses yang dijalankan di bawah myGroup
hingga 500 MB memori fisik dengan memory.limit_in_bytes
dan hingga 5000 MB memori fisik dan swap bersama dengan memory.memsw.limit_in_bytes
. Info selengkapnya tentang opsi ini dapat ditemukan di sini:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-memory
Untuk menjalankan proses di bawah grup kontrol:
cgexec -g memory:myGroup pdftoppm
Perhatikan bahwa pada distribusi Ubuntu modern, contoh ini memerlukan pemasangan cgroup-bin
paket dan pengeditan /etc/default/grub
untuk mengubah GRUB_CMDLINE_LINUX_DEFAULT
ke:
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
dan kemudian menjalankan sudo update-grub
dan mem-boot ulang untuk mem-boot dengan parameter boot kernel yang baru.
Jika proses Anda tidak menelurkan lebih banyak anak yang menggunakan memori paling banyak, Anda dapat menggunakan setrlimit
fungsi. Antarmuka pengguna yang lebih umum untuk itu menggunakan ulimit
perintah dari shell:
$ ulimit -Sv 500000 # Set ~500 mb limit
$ pdftoppm ...
Ini hanya akan membatasi memori "virtual" dari proses Anda, dengan mempertimbangkan—dan membatasi—memori yang dibagikan oleh proses yang dipanggil dengan proses lain, dan memori yang dipetakan tetapi tidak dicadangkan (misalnya, tumpukan besar Java). Namun, memori virtual adalah perkiraan terdekat untuk proses yang tumbuh sangat besar, membuat kesalahan tersebut menjadi tidak signifikan.
Jika program Anda memunculkan anak-anak, dan merekalah yang mengalokasikan memori, itu menjadi lebih kompleks, dan Anda harus menulis skrip tambahan untuk menjalankan proses di bawah kendali Anda. Saya menulis di blog saya, mengapa dan bagaimana.
Ada beberapa masalah dengan ulimit. Berikut bacaan bermanfaat tentang topik ini:Membatasi konsumsi waktu dan memori suatu program di Linux, yang mengarah ke alat batas waktu, yang memungkinkan Anda mengurung proses (dan percabangannya) berdasarkan waktu atau konsumsi memori.
Alat batas waktu membutuhkan Perl 5+ dan /proc
sistem file terpasang. Setelah itu Anda menyalin alat tersebut ke mis. /usr/local/bin
seperti itu:
curl https://raw.githubusercontent.com/pshved/timeout/master/timeout | \
sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout
Setelah itu, Anda dapat 'mengkurung' proses Anda dengan konsumsi memori seperti pada pertanyaan Anda seperti ini:
timeout -m 500 pdftoppm Sample.pdf
Atau Anda bisa menggunakan -t <seconds>
dan -x <hertz>
untuk masing-masing membatasi proses berdasarkan waktu atau batasan CPU.
Cara kerja alat ini adalah dengan memeriksa beberapa kali per detik jika proses yang dihasilkan belum melewati batasan yang ditetapkan. Ini berarti sebenarnya ada jendela kecil di mana proses berpotensi menjadi oversubscribe sebelum batas waktu pemberitahuan dan menghentikan proses.
Oleh karena itu, pendekatan yang lebih tepat kemungkinan akan melibatkan cgroup, tetapi itu jauh lebih rumit untuk disiapkan, bahkan jika Anda menggunakan Docker atau runC, yang antara lain, menawarkan abstraksi yang lebih ramah pengguna seputar cgroup.