Entonces tengo 4 GB de RAM + 4GB de intercambio. Quiero crear un usuario con RAM e intercambio limitados: 3 GB de RAM y 1 GB de intercambio. ¿Es posible tal cosa? ¿Es posible iniciar aplicaciones con RAM limitada e intercambiar disponibles sin crear un usuario separado (y sin instalar ninguna aplicación especial, teniendo solo una configuración predeterminada del servidor Debian / CentOS y sin usar sudo)?
Actualizar:
Entonces abrí terminall y escribí en él el comando ulimit : ulimit -v 1000000
que será como una 976,6Mb
limitación. Luego llamé ulimit -a
y vi que la limitación está "activada". Luego comencé un script bash que compila e inicia mi aplicación nohup
, una larga nohup ./cloud-updater-linux.sh >& /dev/null &
... pero después de un tiempo vi:
(lo cual estaría bien si no se aplicaran limitaciones: descargó una gran biblioteca y comenzó a compilarla).
¿Pero pensé que apliqué limitaciones al shell y a todos los procesos iniciados con / desde él con ulimit -v 1000000
? ¿Qué me equivoqué? ¿Cómo hacer que un terminal y todos los subprocesos que lanza estén limitados en el uso de RAM?
fuente
Respuestas:
ulimit
está hecho para esto. Puede configurar valores predeterminados paraulimit
cada usuario o por grupo enulimit -v KBYTES
establece el tamaño máximo de memoria virtual. No creo que puedas dar una cantidad máxima de intercambio. Es solo un límite en la cantidad de memoria virtual que el usuario puede usar.Entonces
limits.conf
tendría la línea (hasta un máximo4G
de memoria)ACTUALIZACIÓN - CGroups
Los límites impuestos por
ulimit
ylimits.conf
es por proceso. Definitivamente no estaba claro en ese punto.Si desea limitar la cantidad total de memoria que utiliza un usuario (que es lo que solicitó). Desea usar cgroups .
En
/etc/cgconfig.conf
:Esto crea un
cgroup
que tiene un límite máximo de memoria de 4GiB.En
/etc/cgrules.conf
:Esto hará que todos los procesos ejecutados
luser
se ejecuten dentro de losmemlimit
cgroups creados encgconfig.conf
.fuente
useradd
?No puede limitar el uso de memoria en el nivel de usuario, ulimit puede hacerlo pero para un solo proceso.
Incluso con el uso de límites por usuario
/etc/security/limits.conf
, un usuario puede usar toda la memoria ejecutando múltiples procesos.Si realmente desea limitar los recursos, debe usar una herramienta de administración de recursos, como rcapd utilizada por proyectos y zonas en Solaris.
Hay algo que parece proporcionar características similares en Linux que podrías investigar: cgroups .
fuente
cgroups
son la forma correcta de hacer esto, como lo han señalado otras respuestas. Lamentablemente, no hay una solución perfecta para el problema, como veremos a continuación. Hay muchas formas diferentes de establecer límites de uso de memoria de cgroup. La forma en que uno hace que la sesión de inicio de sesión de un usuario forme parte automáticamente de un grupo c varía de un sistema a otro. Red Hat tiene algunas herramientas, y también systemd .memory.memsw.limit_in_bytes
ymemory.limit_in_bytes
establecer límites que incluyen y no incluyen swap, respectivamente. La desventajamemory.limit_in_bytes
es que cuenta los archivos almacenados en caché por el núcleo en nombre de los procesos en el cgroup contra la cuota del grupo. Menos almacenamiento en caché significa más acceso al disco, por lo que posiblemente esté renunciando a un cierto rendimiento si el sistema de otra manera tuviera algo de memoria disponible.Por otro lado,
memory.soft_limit_in_bytes
permite que cgroup supere la cuota, pero si se invoca al asesino OOM del núcleo, entonces los cgroup que superaron sus cuotas se eliminan primero, lógicamente. Sin embargo, la desventaja de esto es que hay situaciones en las que se necesita algo de memoria de inmediato y no hay tiempo para que el asesino de OOM busque procesos para matar, en cuyo caso algo podría fallar antes de que los procesos del usuario con exceso de cuota delicado.ulimit
, sin embargo, es absolutamente la herramienta incorrecta para esto. ulimit pone límites al uso de memoria virtual, lo que casi seguro no es lo que desea. Muchas aplicaciones del mundo real usan mucha más memoria virtual que la memoria física. La mayoría de los tiempos de ejecución recolectados de basura (Java, Go) funcionan de esta manera para evitar la fragmentación. Un programa trivial de "hola mundo" en C, si se compila con un desinfectante de direcciones, puede usar 20 TB de memoria virtual. Asignadores que no dependensbrk
, como jemalloc (que es el asignador predeterminado para Rust) o tcmalloc, también tendrá un uso de memoria virtual sustancialmente superior al uso físico. Para mayor eficiencia, muchas herramientas crearán archivos mmap, lo que aumenta el uso virtual pero no necesariamente el uso físico. Todos mis procesos de Chrome utilizan 2 TB de memoria virtual cada uno. Estoy en una computadora portátil con 8 GB de memoria física. Cualquier forma en que uno intentara establecer cuotas de memoria virtual aquí podría romper Chrome, forzar a Chrome a deshabilitar algunas características de seguridad que dependen de la asignación (pero no usar) grandes cantidades de memoria virtual, o ser completamente ineficaz para evitar que un usuario abuse del sistema .fuente