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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top