Como limitar o uso de memória do aplicativo?

10

Passei duas horas lendo perguntas sobre esse assunto e ainda há alguns mal-entendidos.

Eu tenho esse 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

Isso mostra que ele usa 19.3Mbmemória residente no sistema (não tenho arquivo de troca), em torno 1.8%de toda a 1GBmemória do sistema. O tamanho virtual é 1.39GB?!?. Eu li que ulimit -mnão funciona. As pessoas usam, ulimit -vpor exemplo, a configuração de memória virtual para o processo. Essa memória virtual é a VSZ listada ps? Qual valor devo definir se quiser restringir esse processo para usar 100MBno máximo a memória do sistema. Eu li a documentação setrlimite isso parece legítimo:

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.

Mas em outras versões da documentação esse RLIMIT_ASparâmetro define o tamanho da memória virtual. O que é a verdade?

Dragomir Ivanov
fonte
Por favor, preste atenção ao postar formatação.
rozcietrzewiacz

Respostas:

6

Sim, o VSZ é memória virtual. Quanto a RLIMIT_AS, onde você encontrou o parágrafo citado acima? Como setrlimit (2) é uma chamada de sistema Linux, não vejo como isso poderia monitorar o malloc (3), uma função de biblioteca. Em vez disso, ele só pode funcionar com brk (2), sbrk (2) e mmap (2) - também é isso que sua página de manual (verificada no Scientific Linux) sugere. No entanto, a quantidade total de memória solicitada por meio dessas funções é a memória virtual; portanto, o RLIMIT_AS limita a memória virtual. (Isso está novamente de acordo com a página de manual setrlimit (2).)

Infelizmente, você não pode limitar o RSS no Linux (isso seria ulimit -m). Você pode tentar ulimit -d(RLIMIT_DATA), mas isso ignorará o mmap (2), normalmente usado para grandes alocações. Outra possibilidade seria limitar a memória virtual, mas com uma diferença tão grande entre RSS e VSZ, isso pode ser difícil.

Ansgar Esztermann
fonte
Obrigado pela sua resposta. O parágrafo é da setrlimitpágina de manual IEEE/The Open Group 2003 GETRLIMIT(3P)Como pspode me mostrar o RSS, mas o kernel não pode impor limites a ele?
Dragomir Ivanov 22/02
6
De acordo com Alan Cox, isso tem razões históricas: calcular o RSS costumava ser caro, portanto, impor o limite sobrecarregaria o kernel; fonte: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Veja também stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Eu vejo. Eu acho que eu iria com ulimit -dentão. O aplicativo foi escrito por mim e eu não o usei mmap().
Dragomir Ivanov 22/02
2
Não, você normalmente não (nem sbrk ()), mas o malloc () pode.
Ansgar Esztermann 22/02/12
Eu vejo. Isso é muito lamentável. Portanto, a solução para essa pergunta é cgroups ou pesquisa de uso de memória com alguma linguagem de script.
Dragomir Ivanov
3

Muitos processos compartilham parte de sua memória com outros processos, por exemplo, libc é usado por quase todos os processos, mas apenas é mapeado na memória uma vez, mas conta para o uso da memória virtual de todos os processos. A limitação do uso da memória usada apenas por um determinado processo (principalmente o RSS) pode ser feita usando cgroups. Consulte as respostas em Como limitar o total de recursos (memória) de um processo e seus filhos para saber como fazê-lo. Isso limitará a memória total de um processo e de seus filhos.

JanKanis
fonte