Como eu mato automaticamente processos que vazam memória?

8

Estou com problemas com processos que vazam memória. Eles fazem com que meu disco rígido seja preenchido com arquivos de troca /private/var/vm.

Eu gostaria que os processos de vazamento fossem mortos à vista pelo sistema operacional . Não estou interessado em um diálogo que apareça após 20 minutos, sugira aplicativos para matar e nem mostre o que está vazando.

Tentei definir os limites rsse data, /etc/launchd.confmas não pareceu ter efeito.

Este é o meu /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Aqui está a launchctl limitsaída:

% 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

Este é o meu .zshrc:

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

E a ulimit -asaída (em 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

No entanto, aqui está o que topme diz sobre o 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

Parece que nenhum dos métodos de limitação de memória documentados realmente funciona. Existe um mecanismo adicional que eu possa ter perdido?

sam hocevar
fonte
230 GiB ?! Eu realmente espero que você tenha perdido um ponto decimal.
duci9y
@ duci9y Não :-(
sam hocevar
3
Nesse caso, eu realmente espero que alguém resolva seu problema. Você estará em minhas orações.
duci9y
Acabei removendo a menção de qual era o processo de vazamento porque as pessoas no IRC começaram a me dar uma lição sobre por que eu deveria usar o clang ++ em vez do llvm-g ++ e isso só me faz querer atingi-los com objetos pontudos.
Sam Hocevar
Objetos pontudos em chamas.
duci9y

Respostas:

3

Eu criaria um script simples que filtraria o processo de qualquer processo com um tamanho de memória residente (ou talvez tamanho total de vm, incluindo todas as páginas paginadas) maior que um limite que eu defino (dependendo da quantidade de processo, memória total disponível e talvez também disponibilidade da CPU). Pode-se usar um pouco de script bash com topou pspara desenterrar a lista de processos e tamanho da memória.

Nesta lista filtrada, eu usaria o leakscomando (veja vazamentos do man 1 ) por PID do processo. Se a quantidade total de memória vazada relatada pelo comando for maior do que outro limite, eu a mataria e reapareceria.

NOTA : Você deve tomar cuidado para não matar nenhum processo de sistema operacional / sistema sem saber o que faz. Para evitar essa situação, talvez você deva filtrar a lista usando uma abordagem de "lista branca".

Huygens
fonte
1

O ulimit na maioria das plataformas não funciona conforme o esperado.

Se esse não for um aplicativo de desktop, execute o agressor com um supervisor de processo adequado, como https://github.com/arya/bluepill

Se esse for um aplicativo de desktop, entre em contato com os desenvolvedores do aplicativo. O feedback é necessário e importante.

O UX na GUI do OOM killer para Mac é horrível. Ele deve ser classificado em ordem decrescente, com um gráfico de barras proporcional para o uso de ram de cada processo. Além disso, ele deve automaticamente SIGCONT todos os processos pausados ​​quando resolvido.

dhchdhd
fonte
1
Eu tive o problema com várias aplicações, mas o canudo que quebrou as costas do camelo era da Apple llvm-g++. O problema foi relatado no Radar. Estou curioso: que outra plataforma não funciona ulimit? Eu uso vários sabores do Unix há quase 20 anos e não me lembro de ter visto um.
Sam Hocevar
-2

Se você precisar disso durante as reinicializações, use apenas o launchctl limitcomando

Se você precisar limitar a memória do aplicativo, também deve limitar o segmento da pilha.

Eir Nym
fonte
Como você pode ver na saída, o tamanho da pilha e o tamanho dos dados são limitados. Fiz a pergunta porque launchctl limité que não funciona.
Sam Hocevar
ulimitvocê usa realmente não funciona como você precisa. launchctl limitfaz.
Eir Nym
e outro momento a ser iluminado em limites: quando o programa atinge limites, recebe um aviso. mas com ação de limite suave será executada com sucesso, com força - falhará. Portanto, se o programa solicitar memória além do limite rígido, nenhuma memória será alocada.
Eir Nym
launchctl limitse não trabalhar, ou eu não estaria fazendo a pergunta.
Sam Hocevar
como você mede o tamanho do aplicativo?
Eir Nym