Como limitar o uso da memória do aplicativo?

9

Eu passei 2 horas lendo perguntas sobre esse assunto, e ainda há algum mal-entendido.

Eu tenho este 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.3Mb da memória residente do sistema (não tenho nenhum arquivo de troca), em torno de 1.8% de toda a memória do sistema 1GB . O tamanho virtual é 1.39GB ?!?. Eu li que ulimit -m não funciona. As pessoas usam ulimit -v , por exemplo definindo memória virtual para o processo. Esta memória virtual é a única VSZ listada com ps ? Qual valor devo definir se quiser restringir esse processo para usar no máximo 100MB de memória do sistema. Eu li a documentação para setrlimit e 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 parâmetro RLIMIT_AS define o tamanho da memória virtual. Qual é a verdade?

    
por Dragomir Ivanov 22.02.2012 / 09:40

2 respostas

5

Sim, o VSZ é uma memória virtual. Quanto ao RLIMIT_AS, onde você encontrou o parágrafo citado acima? Como o setrlimit (2) é uma chamada do sistema Linux, não vejo como ele poderia monitorar o malloc (3), uma função da biblioteca. Em vez disso, ele só pode trabalhar com brk (2), sbrk (2) e mmap (2) - isso também é o que sugere sua manpage (verificada no Scientific Linux). No entanto, a quantidade total de memória solicitada por meio dessas funções é memória virtual, de modo que RLIMIT_AS de fato limita a memória virtual. (Isso é, 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 irá ignorar 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 o RSS e o VSZ, isso pode ser difícil.

    
por 22.02.2012 / 10:36
3

Muitos processos compartilham parte de sua memória com outros processos, por exemplo, A libc é usada por quase todos os processos, mas apenas mapeada na memória uma vez, mas conta para o uso da memória virtual de cada processo. Limitar o uso de memória que é usado apenas por um determinado processo (principalmente RSS) pode ser feito usando cgroups. Veja as respostas para 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 seus filhos.

    
por 18.12.2014 / 17:51

Tags