Hay muchas preguntas y respuestas sobre la limitación de los recursos de un solo proceso, por ejemplo, RLIMIT_AS se puede utilizar para restringir la memoria máxima asignada por un proceso que puede verse como VIRT top
. Más sobre el tema, por ejemplo, aquí. ¿Hay alguna manera de limitar la cantidad de memoria que un proceso en particular puede usar en Unix?
setrlimit(2)
la documentación dice:
Un proceso hijo creado a través de fork (2) hereda los límites de recursos de su padre. Los límites de recursos se conservan en execve (2).
Debe entenderse de la siguiente manera:
Si un proceso tiene un RLIMIT_AS de, por ejemplo, 2GB, entonces no puede asignar más memoria que 2GB. Cuando genera un hijo, el límite de espacio de direcciones de 2 GB se transferirá al hijo, pero el recuento comienza desde 0. Los 2 procesos juntos pueden ocupar hasta 4 GB de memoria.
Pero, ¿cuál sería la forma útil de restringir la suma total de memoria asignada por un árbol completo de procesos?
Respuestas:
No estoy seguro de si esto responde a su pregunta, pero encontré este script de Perl que dice hacer exactamente lo que está buscando. El script implementa su propio sistema para hacer cumplir los límites al despertar y verificar el uso de recursos del proceso y sus elementos secundarios. Parece estar bien documentado y explicado, y se ha actualizado recientemente.
Como slm dijo en su comentario, cgroups también se puede usar para esto. Es posible que deba instalar las utilidades para administrar cgroups, suponiendo que esté en Linux que debería buscar
libcgroups
.Asegúrese de que
$USER
sea su usuario.Su usuario debería tener acceso a la configuración de memoria de cgroup en
/sys/fs/cgroup/memory/myGroup
.Luego puede establecer el límite en, digamos 500 MB, haciendo esto:
Ahora ejecutemos Vim:
El proceso vim y todos sus elementos secundarios ahora deberían limitarse al uso de 500 MB de RAM. Sin embargo , creo que este límite solo se aplica a la RAM y no al intercambio. Una vez que los procesos alcanzan el límite, comenzarán a intercambiarse. No estoy seguro de si puede evitar esto, no puedo encontrar una manera de limitar el uso de intercambio utilizando cgroups.
fuente
sudo yum install libcgroup-tools
Creé un script que hace esto, usando cgmanager que se usa en Ubuntu. Una ventaja es que esto no requiere acceso de root. Tenga en cuenta que cgroup management es un poco específico de la distribución, por lo que no sé si esto funciona en distribuciones que usan systemd cgroup management.
uso: guardar como
limitmem
en su ruta y hacerlo ejecutable. Luego corre eglimitmem 1G command...
. Esto limita la memoria realmente utilizada. Si se alcanza eso, el asesino de OOM matará el proceso o uno de sus hijos, pero no algo aleatorio que no tenga nada que ver con este comando.fuente
cgm
guía, fue útil/unix//a/536046/4319 :
En cualquier distribución basada en systemd, también puede usar cgroups indirectamente a través de systemd-run. Por ejemplo, para su caso de limitación
pdftoppm
a 500M de RAM, use:...
fuente