Come limitare l'utilizzo della memoria dell'applicazione?


10

Ho trascorso 2 ore a leggere domande su questo argomento, e c'è ancora qualche malinteso.

Ho questo processo:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Ciò mostra che utilizza la 19.3Mbmemoria residente del sistema (non ho alcun file di scambio), attorno a 1.8%tutta la 1GBmemoria del sistema. La dimensione virtuale è 1.39GB?!?. Ho letto che ulimit -mnon funziona. Le persone usano ulimit -vad esempio l'impostazione della memoria virtuale per il processo. Questa memoria virtuale è quella elencata con VSZ ps? Quale valore devo impostare se voglio limitare questo processo per utilizzare 100MBal massimo la memoria di sistema. Ho letto la documentazione per setrlimite questo sembra legittimo:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Ma su altre versioni della documentazione questo RLIMIT_ASparametro imposta la dimensione della memoria virtuale. Qual'è la verità?


Prestare attenzione alla formattazione dei post.
rozcietrzewiacz,

Risposte:


6

Sì, VSZ è memoria virtuale. Quanto a RLIMIT_AS, dove hai trovato il paragrafo sopra citato? Poiché setrlimit (2) è una chiamata di sistema Linux, non vedo come possa 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 è la memoria virtuale, quindi RLIMIT_AS limita effettivamente la memoria virtuale. (Questo è, ancora una volta, in conformità con la manpage setrlimit (2).)

Sfortunatamente, non puoi limitare RSS sotto Linux (questo sarebbe ulimit -m). Puoi provare ulimit -d(RLIMIT_DATA), ma questo ignorerà mmap (2), generalmente utilizzato per allocazioni di grandi dimensioni. Un'altra possibilità sarebbe quella di limitare la memoria virtuale, ma con una differenza così grande tra RSS e VSZ, questo potrebbe essere difficile.


La ringrazio per la risposta. Il paragrafo è dalla setrlimitpagina man IEEE/The Open Group 2003 GETRLIMIT(3P)Come psmai mi può mostrare l'RSS, ma il kernel non può imporre limiti su di esso?
Dragomir Ivanov,

6
Secondo Alan Cox, questo ha ragioni storiche: il calcolo dell'RSS era costoso, quindi applicare il limite avrebbe comportato un grosso carico sul kernel; fonte: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Vedere anche stackoverflow.com/questions/3043709/...
Ansgar Esztermann

Vedo. Immagino che ci andrei ulimit -dallora. L'applicazione è stata scritta da me e non l'ho usata mmap().
Dragomir Ivanov,

2
No, di solito no (né sbrk ()), ma malloc () potrebbe.
Ansgar Esztermann,

Vedo. Questo è molto sfortunato. Quindi la soluzione a questa domanda è o cgroups o sondaggio sull'utilizzo della memoria con un linguaggio di script.
Dragomir Ivanov,

3

Molti processi condividono parte della sua memoria con altri processi, ad esempio libc viene utilizzato da quasi tutti i processi ma viene 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 come farlo. Ciò limiterà la memoria totale di un processo e dei suoi figli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.