He pasado 2 horas leyendo preguntas sobre este asunto, y todavía hay algunos malentendidos.
Tengo este proceso:
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
Esto muestra que utiliza la 19.3Mb
memoria residente del sistema (no tengo ningún archivo de intercambio), alrededor 1.8%
de la 1GB
memoria del sistema completo . El tamaño virtual es 1.39GB
?!?. He leído que ulimit -m
no funciona. La gente usa, ulimit -v
por ejemplo, configurar la memoria virtual para el proceso. ¿Es esta memoria virtual la que aparece en VSZ ps
? Qué valor debo establecer si quiero restringir este proceso para utilizar la 100MB
memoria del sistema como máximo. He leído la documentación setrlimit
y esto 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.
Pero en otras versiones de la documentación, este RLIMIT_AS
parámetro establece el tamaño de la memoria virtual. ¿Cuál es la verdad?
Respuestas:
Sí, VSZ es memoria virtual. En cuanto a RLIMIT_AS, ¿dónde encontraste el párrafo citado anteriormente? Como setrlimit (2) es una llamada al sistema Linux, no veo cómo podría monitorear malloc (3), una función de biblioteca. En cambio, solo puede funcionar con brk (2), sbrk (2) y mmap (2); esto también es lo que sugiere su página de manual (comprobada en Scientific Linux). Sin embargo, la cantidad total de memoria solicitada a través de estas funciones es memoria virtual, por lo que RLIMIT_AS limita la memoria virtual. (Esto es, de nuevo, de acuerdo con la página de manual de setrlimit (2)).
Desafortunadamente, no puede limitar RSS en Linux (esto sería
ulimit -m
). Puede probarulimit -d
(RLIMIT_DATA), pero esto ignorará mmap (2), que generalmente se usa para asignaciones grandes. Otra posibilidad sería limitar la memoria virtual, pero con una diferencia tan grande entre RSS y VSZ, esto podría ser difícil.fuente
setrlimit
página de manualIEEE/The Open Group 2003 GETRLIMIT(3P)
¿Cómops
puede mostrarme el RSS, pero el núcleo no puede imponer un límite?ulimit -d
entonces. La aplicación fue escrita por mí y no la utilicémmap()
.Muchos procesos comparten parte de su memoria con otros procesos, por ejemplo, libc se usa en casi todos los procesos, pero solo se asigna en la memoria una vez, pero cuenta para el uso de memoria virtual de cada proceso. Limitar el uso de la memoria que solo usa un determinado proceso (principalmente RSS) se puede hacer usando cgroups. Vea las respuestas a Cómo limitar los recursos totales (memoria) de un proceso y sus elementos secundarios para saber cómo hacerlo. Esto limitará la memoria total de un proceso y sus hijos.
fuente