Jadi saya punya 4 GB RAM + 4GB swap. Saya ingin membuat pengguna dengan ram dan swap terbatas: RAM 3 GB dan swap 1 GB. Mungkinkah itu terjadi? Apakah mungkin untuk memulai aplikasi dengan RAM dan swap terbatas yang tersedia untuk mereka tanpa membuat pengguna yang terpisah (dan tidak menginstal aplikasi khusus - hanya memiliki konfigurasi server Debian / CentOS standar, dan tidak menggunakan sudo)?
Memperbarui:
Jadi saya membuka terminal dan mengetiknya perintah ulimit : ulimit -v 1000000
yang akan menjadi seperti 976,6Mb
batasan. Selanjutnya saya menelepon ulimit -a
dan melihat keterbatasan itu "aktif". Lalu saya mulai beberapa skrip bash yang mengkompilasi dan memulai aplikasi saya nohup
, yang panjang nohup ./cloud-updater-linux.sh >& /dev/null &
... tapi setelah beberapa waktu saya melihat:
(yang akan baik-baik saja jika tidak ada batasan yang diterapkan - itu mengunduh beberapa lib besar, dan mulai mengkompilasinya.)
Tapi saya pikir saya menerapkan batasan pada shell dan semua proses diluncurkan dengan / darinya ulimit -v 1000000
? Apa yang salah? Bagaimana cara membuat terminal dan semua sub proses yang diluncurkan terbatas pada penggunaan ram?
sumber
Jawaban:
ulimit
dibuat untuk ini. Anda dapat mengatur default untukulimit
per pengguna atau per grup diulimit -v KBYTES
menetapkan ukuran memori virtual maks. Saya tidak berpikir Anda bisa memberikan jumlah maksimum swap. Ini hanya batas pada jumlah memori virtual yang dapat digunakan pengguna.Jadi, Anda
limits.conf
akan memiliki garis (ke4G
memori maksimum )PEMBARUAN - CGroups
Batas yang diberlakukan oleh
ulimit
danlimits.conf
per proses. Saya jelas tidak jelas tentang hal itu.Jika Anda ingin membatasi jumlah total memori yang digunakan pengguna (yang Anda tanyakan). Anda ingin menggunakan cgroup .
Dalam
/etc/cgconfig.conf
:Ini menciptakan
cgroup
yang memiliki batas memori maksimum 4Gb.Dalam
/etc/cgrules.conf
:Ini akan menyebabkan semua proses dijalankan oleh
luser
dijalankan di dalammemlimit
cgroup yang dibuat dicgconfig.conf
.sumber
useradd
?Anda tidak dapat membatasi penggunaan memori di tingkat pengguna, ulimit dapat melakukan itu kecuali untuk satu proses.
Bahkan dengan menggunakan per batas pengguna di
/etc/security/limits.conf
, pengguna dapat menggunakan semua memori dengan menjalankan beberapa proses.Jika Anda benar-benar ingin membatasi sumber daya, Anda perlu menggunakan alat manajemen sumber daya, seperti rcapd yang digunakan oleh proyek dan zona di bawah Solaris.
Ada sesuatu yang tampaknya menyediakan fitur serupa di Linux yang mungkin Anda selidiki: cgroups .
sumber
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
danmemory.limit_in_bytes
menetapkan batas termasuk dan tidak termasuk swap, masing-masing. Kelemahannyamemory.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 bergantungsbrk
, 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. .sumber