cgroups
sono il modo giusto per farlo, come hanno sottolineato altre risposte. Sfortunatamente non esiste una soluzione perfetta al problema, come vedremo di seguito. Esistono diversi modi per impostare i limiti di utilizzo della memoria del cgroup. Il modo in cui si fa in modo che una sessione di accesso di un utente diventi automaticamente parte di un cgroup varia da sistema a sistema. Red Hat ha alcuni strumenti, così come systemd .
memory.memsw.limit_in_bytes
e memory.limit_in_bytes
impostare limiti includendo e non includendo swap, rispettivamente. Il rovescio della medaglia memory.limit_in_bytes
è che conta i file memorizzati nella cache dal kernel per conto dei processi nel cgroup rispetto alla quota del gruppo. Meno cache significa più accesso al disco, quindi potresti rinunciare ad alcune prestazioni se il sistema disponesse altrimenti di memoria.
D'altra parte, memory.soft_limit_in_bytes
consente al cgroup di superare le quote, ma se il killer OOM del kernel viene invocato, quei cgroup che superano le loro quote vengono uccisi per primi, logicamente. Il rovescio della medaglia di ciò, tuttavia, è che ci sono situazioni in cui è immediatamente necessario un po 'di memoria e non c'è tempo per il killer OOM di cercare i processi da uccidere, nel qual caso qualcosa potrebbe fallire prima che i processi dell'utente in eccesso siano ucciso.
ulimit
, tuttavia, è assolutamente lo strumento sbagliato per questo. ulimit pone dei limiti sull'utilizzo della memoria virtuale, che quasi sicuramente non è quello che desideri. Molte applicazioni del mondo reale usano molta più memoria virtuale rispetto alla memoria fisica. La maggior parte dei runtime raccolti dall'immondizia (Java, Go) funzionano in questo modo per evitare la frammentazione. Un banale programma "ciao mondo" in C, se compilato con disinfettante per indirizzi, può usare 20 TB di memoria virtuale. Allocatori su cui non si basano sbrk
, come jemalloc (che è l'allocatore predefinito per Rust) o tcmalloc, avrà anche un utilizzo della memoria virtuale sostanzialmente superiore al loro utilizzo fisico. Per motivi di efficienza, molti strumenti eseguiranno il mmap dei file, aumentando l'utilizzo virtuale ma non necessariamente quello fisico. Tutti i miei processi Chrome utilizzano 2 TB di memoria virtuale ciascuno. Sono su un laptop con 8 GB di memoria fisica. Qualsiasi modo in cui si tentasse di impostare quote di memoria virtuale qui sarebbe di rompere Chrome, forzare Chrome a disabilitare alcune funzionalità di sicurezza che si basano sull'allocazione (ma non sull'uso) di grandi quantità di memoria virtuale o essere completamente inefficaci per impedire a un utente di abusare del sistema .