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 rss
e data
, /etc/launchd.conf
mas não pareceu ter efeito.
Este é o meu /etc/launchd.conf
:
limit data 8589934592 8589934592
limit rss 8589934592 8589934592
Aqui está a launchctl limit
saí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 -a
saí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 top
me 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?
Respostas:
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
top
oups
para desenterrar a lista de processos e tamanho da memória.Nesta lista filtrada, eu usaria o
leaks
comando (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".
fonte
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.
fonte
llvm-g++
. O problema foi relatado no Radar. Estou curioso: que outra plataforma não funcionaulimit
? Eu uso vários sabores do Unix há quase 20 anos e não me lembro de ter visto um.Se você precisar disso durante as reinicializações, use apenas o
launchctl limit
comandoSe você precisar limitar a memória do aplicativo, também deve limitar o segmento da pilha.
fonte
launchctl limit
é que não funciona.ulimit
você usa realmente não funciona como você precisa.launchctl limit
faz.launchctl limit
se não trabalhar, ou eu não estaria fazendo a pergunta.