¿Cómo limitar el uso de memoria de la aplicación?

10

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.3Mbmemoria residente del sistema (no tengo ningún archivo de intercambio), alrededor 1.8%de la 1GBmemoria del sistema completo . El tamaño virtual es 1.39GB?!?. He leído que ulimit -mno funciona. La gente usa, ulimit -vpor 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 100MBmemoria del sistema como máximo. He leído la documentación setrlimity 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_ASparámetro establece el tamaño de la memoria virtual. ¿Cuál es la verdad?

Dragomir Ivanov
fuente
Por favor, preste atención al formato de publicación.
rozcietrzewiacz

Respuestas:

6

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 probar ulimit -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.

Ansgar Esztermann
fuente
Gracias por su respuesta. El párrafo es de la setrlimitpágina de manual IEEE/The Open Group 2003 GETRLIMIT(3P)¿Cómo pspuede mostrarme el RSS, pero el núcleo no puede imponer un límite?
Dragomir Ivanov
66
Según Alan Cox, esto tiene razones históricas: calcular RSS solía ser costoso, por lo que imponer el límite pondría una gran carga en el núcleo; fuente: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Ver también stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Veo. Supongo que iría ulimit -dentonces. La aplicación fue escrita por mí y no la utilicé mmap().
Dragomir Ivanov
2
No, por lo general no lo hace (ni sbrk ()), pero puede que malloc ().
Ansgar Esztermann
Veo. Eso es muy desafortunado. Entonces, la solución a esta pregunta es cgroups o encuesta de uso de memoria con algún lenguaje de script.
Dragomir Ivanov
3

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.

JanKanis
fuente