cgroups
adalah cara yang tepat untuk melakukan ini, seperti yang ditunjukkan oleh jawaban lain. Sayangnya tidak ada solusi yang sempurna untuk masalah ini, seperti yang akan kita bahas di bawah. Ada banyak cara berbeda untuk menetapkan batas penggunaan memori cgroup. Bagaimana seseorang membuat sesi login pengguna secara otomatis menjadi bagian dari cgroup bervariasi dari satu sistem ke sistem lainnya. Red Hat memiliki beberapa alat, dan begitu pula systemd .
memory.memsw.limit_in_bytes
dan memory.limit_in_bytes
menetapkan batas termasuk dan tidak termasuk swap, masing-masing. Kelemahannya memory.limit_in_bytes
adalah ia menghitung file yang di-cache oleh kernel atas nama proses dalam cgroup terhadap kuota grup. Lebih sedikit caching berarti lebih banyak akses disk, jadi Anda berpotensi memberikan kinerja jika sistem memiliki memori yang tersedia.
Di sisi lain, memory.soft_limit_in_bytes
memungkinkan cgroup untuk melampaui kuota, tetapi jika pembunuh OOM kernel dipanggil maka cgroup yang melebihi kuota mereka terbunuh terlebih dahulu, secara logis. Kelemahan dari itu, bagaimanapun, adalah bahwa ada situasi di mana beberapa memori diperlukan segera dan tidak ada waktu untuk pembunuh OOM untuk mencari-cari proses untuk membunuh, dalam hal ini sesuatu mungkin gagal sebelum proses pengguna kuota berlebihan adalah terbunuh.
ulimit
, bagaimanapun, benar-benar alat yang salah untuk ini. ulimit membatasi penggunaan memori virtual, yang hampir pasti bukan yang Anda inginkan. Banyak aplikasi dunia nyata menggunakan lebih banyak memori virtual daripada memori fisik. Sebagian besar runtime yang dikumpulkan oleh sampah (Java, Go) bekerja dengan cara ini untuk menghindari fragmentasi. Program "hello world" sepele di C, jika dikompilasi dengan pembersih alamat, dapat menggunakan memori virtual 20TB. Alokator yang tidak bergantung sbrk
, seperti jemalloc (yang merupakan pengalokasi default untuk Rust) atau tcmalloc, juga akan memiliki penggunaan memori virtual yang jauh melebihi penggunaan fisiknya. Untuk efisiensi, banyak alat akan mmap file, yang meningkatkan penggunaan virtual tetapi tidak harus penggunaan fisik. Semua proses Chrome saya masing-masing menggunakan memori virtual 2TB. Saya menggunakan laptop dengan memori fisik 8GB. Dengan cara apa pun seseorang mencoba mengatur kuota memori virtual di sini akan memecah Chrome, memaksa Chrome untuk menonaktifkan beberapa fitur keamanan yang bergantung pada mengalokasikan (tetapi tidak menggunakan) memori virtual dalam jumlah besar, atau sama sekali tidak efektif mencegah pengguna menyalahgunakan sistem. .