Resident Set Size (RSS) limite não tem efeito
Pergunta
O seguinte problema ocorre em um computador executando o Ubuntu 10.04 com o 2.6.32-22-generic do kernel:A definição de um limite para o Tamanho do Conjunto Residente (RSS) de um processo não parecem ter qualquer efeito.Atualmente, o limite é definido em Python com o seguinte código:
import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000 # this should fail
A lista, memory_sink, sucede a cada vez.Quando eu verificar RSS utilização de topo, pode facilmente começar o processo de usar 1 gb de RAM, o que significa que o limite não está funcionando.Fazer RSS limites não funcionar com este kernel ou distro?Se isso ajuda, de recursos.RLIMIT_NPROC (usuário limite do processo) não funciona.
Solução
Formar a manpra getrlimit:
RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
Parece que isso não é suportado no Linux Kernel 2.6.
Outras dicas
Você pode realizar isso usando CGROUPS. A versão longa está no meu blog, mas a versão curta (testada no Ubuntu 11.04) é:
Instale o
cgroup-bin
pacote.Editar
/etc/cgconfig.config
e crie um grupo com memória limitada. Por exemplo, eu adicionei:group limited { memory { memory.limit_in_bytes = 50M; } }
Corre
$ sudo restart cgconfig $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited $ cgexec -g memory:limited your/program
Observei meu processo com um RSS de 93m quando pedi para usar apenas 50m, mas isso não foi um problema para mim, já que meu objetivo era apenas obter o programa para a página.
cgclassify
Permite anexar restrições a um processo em execução também. Nota Para o RSS, isso se aplica apenas à memória alocada após a vigorção da restrição.
Um limite relacionado - memória virtual ou espaço de endereço (rlimit_as) - funciona. Isso permite limitar o processo Python e subprocessar a memória sem ferramentas externas.
>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
De página de homem:
Rlimit_as. O tamanho máximo da memória virtual do processo (espaço de endereço) em bytes.
Aqui está uma boa explicação da diferença entre o conjunto residente e o tamanho da VM - O que é RSS e VSZ no Linux Memory Management.
Eu criei um script para limitar o uso de memória usando o cgroups e cgroup manager, utilizável para comandos ad-hoc e não necessitar de privilégios de root.Ver https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894