Pregunta

El siguiente problema se produce en una máquina con Ubuntu 10.04 con el kernel 2.6.32-22-generic: Establecer un límite para el tamaño del conjunto residente (RSS) de un proceso no parece tener ningún efecto. Actualmente me puse el límite en Python con el siguiente 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

La lista, memory_sink, sucede cada vez. Cuando compruebo el uso de RSS con la parte superior, puedo conseguir fácilmente el proceso de usar 1 GB de RAM, lo que significa que el límite no está funcionando. Do RSS limita no funciona con este kernel o distribución? Si ayuda, resource.RLIMIT_NPROC (límite de proceso de usuario) funciona.

¿Fue útil?

Solución

Formar la página de manual 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 esto simplemente no es compatible con Linux kernel 2.6.

Otros consejos

Se puede lograr esto usando cgroups. La versión larga es en mi el blog , pero la versión corta (probado en Ubuntu 11.04) es:

  • Instalar el paquete cgroup-bin.

  • /etc/cgconfig.config Editar y crear un grupo con memoria limitada. por ejemplo, añadí:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • Ejecutar

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

Observé mi proceso con una fuente del 93M cuando le pregunté a utilizar solamente 50M, pero eso no fue un problema para mí, ya que mi objetivo era sólo para obtener el programa a la página.

cgclassify le permite conectar restricciones a un proceso que se ejecuta también. Nota para RSS esto sólo se aplica a la memoria asignada después de la restricción entra en vigor.

Un límite relacionada - la memoria virtual o espacio de direcciones (rlimit_as) - funciona. Esto permite limitar la memoria de proceso pitón y subprocesos sin necesidad de herramientas 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

Desde el página del manual :

  

rlimit_as . El tamaño máximo de la memoria virtual del proceso (espacio de direcciones) en bytes.

Aquí hay una buena explicación de la diferencia entre el conjunto residente y el tamaño VM - ¿Qué es RSS y VSZ en Linux gestión de memoria.

He creado un script para el uso de memoria límite usando cgroups y gerente cgroup, utilizables para los comandos ad-hoc y no necesitan privilegios 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top