Come posso uccidere automaticamente i processi che perdono memoria?


8

Ho problemi con i processi che perdono memoria. In questo modo il mio disco rigido viene riempito con file di scambio /private/var/vm.

Vorrei che i processi che perdevano venissero interrotti a vista dal sistema operativo . Non mi interessa una finestra di dialogo che appare dopo 20 minuti, suggerisce applicazioni da uccidere e non mostra nemmeno quella che perde.

Ho provato a impostare i limiti rsse ma non sembra avere alcun effetto.data/etc/launchd.conf

Questo è il mio /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Ecco l' launchctl limitoutput:

% 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' ulimit -aoutput (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 topmi 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. Esiste un meccanismo aggiuntivo che potrei aver perso?


230 GiB ?! Spero davvero che tu abbia perso un punto decimale.
duci9y,

@ duci9y No :-(
sam hocevar

3
In tal caso, spero davvero che qualcuno risolva il tuo problema. Sarai nelle mie preghiere.
duci9y,

Alla fine ho rimosso la menzione di ciò che è stato il processo di perdite perché le persone su IRC hanno iniziato a insegnarmi sul motivo per cui dovrei usare clang ++ invece di llvm-g ++ e questo mi fa solo venire voglia di colpirli con oggetti appuntiti.
Sam Hocevar,

Oggetti appuntiti in fiamme.
duci9y

Risposte:


3

Vorrei creare uno script semplice che filtrasse qualsiasi processo con una dimensione della memoria residente (o forse una dimensione totale di vm, quindi includendo qualsiasi pagina paginata) più grande di una soglia che definisco (a seconda della quantità di processo, memoria totale disponibile e forse anche disponibilità della CPU). Si può usare un po 'di script bash con topo psper estrarre l'elenco delle dimensioni del processo e della memoria.

Da questo elenco filtrato, utilizzerei il leakscomando (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 rigenererei di nuovo.

NOTA : fare attenzione a non interrompere alcun processo OS / sistema senza sapere cosa si fa. Per evitare questa situazione, dovresti forse filtrare la lista usando un approccio "lista bianca".


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 https://github.com/arya/bluepill

Se si tratta di un'app desktop, contattare gli sviluppatori di app. Il feedback è necessario e importante.

La UX sulla GUI di Killer OOM per Mac è orribile. Dovrebbe essere il più grande in ordine decrescente con un grafico a barre proporzionale per l'utilizzo della ram di ogni processo. Inoltre, quando risolto dovrebbe automaticamente SIGCONT tutti i processi in pausa.


1
Ho avuto il problema con diverse applicazioni, ma la cannuccia che ha spezzato la schiena del cammello era di Apple llvm-g++. Il problema è stato segnalato in Radar. Sono curioso: quale altra piattaforma ha un non funzionante ulimit? Sto usando diversi gusti di Unix da quasi 20 anni e non ricordo di averne visto uno.
Sam Hocevar,

-2

Se è necessario questo attraverso i riavvii, è necessario utilizzare solo il launchctl limitcomando.

Se è necessario limitare la memoria dell'applicazione, è necessario limitare anche il segmento dello stack.


Come puoi vedere nell'output, sia la dimensione dello stack che la dimensione dei dati sono limitate. Ho fatto la domanda perché launchctl limitnon non funziona.
Sam Hocevar,

ulimitusi davvero non funziona come ti serve. launchctl limitlo fa.
Eir Nym

e un altro momento da illuminare nei limiti: quando il programma raggiunge i limiti riceve un avviso. ma con soft limit l'azione verrà eseguita con successo, con hard - fallirà. Pertanto, se il programma richiede memoria oltre il limite massimo, non verrà allocata memoria.
Eir Nym

launchctl limitnon non funzionano, o non sarei porre la domanda.
Sam Hocevar,

come si misura la dimensione dell'applicazione?
Eir Nym
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.