python - El límite de tamaño de conjunto residente(RSS) no tiene efecto
resources limits (4)
Creé una secuencia de comandos para limitar el uso de memoria usando cgroups y cgroup manager, utilizable para comandos ad-hoc y sin necesidad de privilegios de root. Consulte https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894
El siguiente problema ocurre en una máquina que ejecuta Ubuntu 10.04 con el kernel 2.6.32-22-genérico: establecer un límite para el tamaño del conjunto residente (RSS) de un proceso no parece tener ningún efecto. Actualmente establezco 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, tiene éxito cada vez. Cuando verifico el uso de RSS con la parte superior, puedo conseguir fácilmente que el proceso use 1 gb de RAM, lo que significa que el límite no está funcionando. ¿Los límites RSS no funcionan con este kernel o distro? Si ayuda, funciona resource.RLIMIT_NPROC (límite de proceso de usuario).
Forma la página de manual de 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 el kernel 2.6 de Linux.
Puedes lograr esto usando cgroups. La versión larga está en mi blog , pero la versión corta (probada en Ubuntu 11.04) es:
Instale el paquete
cgroup-bin
.Edite
/etc/cgconfig.config
y cree un grupo con memoria limitada. Por ejemplo, he añadido:group limited { memory { memory.limit_in_bytes = 50M; } }
correr
$ sudo restart cgconfig $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited $ cgexec -g memory:limited your/program
Observé mi proceso con un RSS de 93M cuando le pedí que usara solo 50M, pero eso no fue un problema para mí, ya que mi objetivo era obtener el programa a la página.
cgclassify
permite adjuntar restricciones a un proceso en ejecución. Nota para RSS esto solo se aplica a la memoria asignada después de que la restricción entre en vigencia.
Un límite relacionado - memoria virtual o espacio de direcciones (RLIMIT_AS) - funciona. Esto permite limitar el proceso de Python y subprocesar la memoria sin 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
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 de la máquina virtual: ¿Qué es RSS y VSZ en la administración de memoria de Linux ?