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.3Mb
memória residente no sistema (não tenho arquivo de troca), em torno 1.8%
de toda a 1GB
memória do sistema. O tamanho virtual é 1.39GB
?!?. Eu li que ulimit -m
não funciona. As pessoas usam, ulimit -v
por 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 100MB
no máximo a memória do sistema. Eu li a documentação 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 RLIMIT_AS
parâmetro define o tamanho da memória virtual. O que é a verdade?
Respostas:
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 tentarulimit -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.fonte
setrlimit
página de manualIEEE/The Open Group 2003 GETRLIMIT(3P)
Comops
pode me mostrar o RSS, mas o kernel não pode impor limites a ele?ulimit -d
então. O aplicativo foi escrito por mim e eu não o useimmap()
.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.
fonte