Come si eliminano automaticamente i processi che perdono memoria?

8

Ho problemi con i processi che perdono memoria. Fanno riempire il mio disco rigido di file di scambio in /private/var/vm .

Vorrei che i processi di perdita fossero uccisi a vista dal sistema operativo . Non sono interessato a una finestra di dialogo che appare dopo 20 minuti, suggerisce le applicazioni da uccidere e non mostra nemmeno quella che perde.

Ho provato a impostare i limiti rss e data in /etc/launchd.conf ma non sembra che abbia un effetto.

Questo è il mio /etc/launchd.conf :

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Ecco l'output launchctl limit :

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

Questo è il mio .zshrc :

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

E l'output ulimit -a (in ZSH):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

Eppure ecco cosa top mi dice del processo:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

Sembra proprio che nessuno dei metodi di limitazione della memoria documentati funzioni effettivamente. C'è un ulteriore meccanismo che forse mi è sfuggito?

    
posta sam hocevar 28.02.2013 - 23:50
fonte

3 risposte

3

Creerei un semplice script che filtrerebbe ogni processo con una dimensione di memoria residente (o forse la dimensione totale di vm, quindi includendo qualsiasi pagina paginata) più grande di una soglia che definisco (a seconda della quantità di processo, totale memoria disponibile e forse anche disponibilità della CPU). Si può usare un po 'di script bash con top o ps per scavare l'elenco delle dimensioni del processo e della memoria.

Da questo elenco filtrato, vorrei usare il comando leaks (vedi man 1 leaks ) per processo PID. Se la quantità totale di memoria trapelata segnalata dal comando è superiore a un'altra soglia, la ucciderei e la risponderò.

NOTA : dovresti fare attenzione a non uccidere i processi del sistema operativo / sistema senza sapere cosa fai. Per evitare questa situazione, dovresti forse filtrare l'elenco usando un approccio "lista bianca".

    
risposta data 08.03.2013 - 08:41
fonte
1

ulimit sulla maggior parte delle piattaforme non funziona come previsto.

Se questa non è un'app desktop, esegui l'autore del reato con un supervisore di processo adeguato come link

Se questa è un'app desktop, contatta gli sviluppatori dell'app. Il feedback è necessario e importante.

L'UX sulla GUI di OOM Killer per Mac è orribile. Dovrebbe essere la più grande ordinata decrescente con un grafico a barre proporzionale per l'utilizzo della RAM di ciascun processo. Inoltre, dovrebbe risolvere automaticamente SIGCONT tutti i processi in pausa una volta risolto.

    
risposta data 05.03.2013 - 15:48
fonte
-2

Se ti serve questo attraverso i riavvii dovresti usare solo il comando launchctl limit .

Se hai bisogno di limitare la memoria dell'applicazione, devi anche limitare il segmento dello stack.

    
risposta data 07.03.2013 - 08:29
fonte

Leggi altre domande sui tag