Sì, VSZ è memoria virtuale. Per quanto riguarda RLIMIT_AS, dove hai trovato il paragrafo sopra citato? Poiché setrlimit(2) è una chiamata di sistema di Linux, non vedo come potrebbe monitorare malloc(3), una funzione di libreria. Invece, può funzionare solo con brk(2), sbrk(2) e mmap(2) -- questo è anche ciò che suggerisce la sua manpage (controllata da Scientific Linux). Tuttavia, la quantità totale di memoria richiesta tramite queste funzioni è memoria virtuale, quindi RLIMIT_AS limita effettivamente la memoria virtuale. (Questo è, ancora una volta, in accordo con la manpage setrlimit(2).)
Sfortunatamente, non puoi limitare RSS sotto Linux (questo sarebbe ulimit -m
). Puoi provare ulimit -d
(RLIMIT_DATA), ma questo includerà mmap(2) solo a partire da Linux 4.7, tipicamente usato per grandi allocazioni. Un'altra possibilità sarebbe quella di limitare la memoria virtuale, ma con una differenza così grande tra RSS e VSZ, questo potrebbe essere difficile.
Molti processi condividono parte della sua memoria con altri processi, ad es. libc viene utilizzato da quasi tutti i processi ma mappato in memoria solo una volta, ma conta per l'utilizzo della memoria virtuale di ogni processo. La limitazione dell'utilizzo della memoria utilizzata solo da un determinato processo (principalmente RSS) può essere eseguita utilizzando cgroups. Vedi le risposte a Come limitare le risorse totali (memoria) di un processo e dei suoi figli per sapere come farlo. Questo limiterà la memoria totale di un processo e dei suoi figli.