
Entonces tengo 4 GB de RAM + 4 GB 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 intercambiarlas sin crear un usuario separado (y sin instalar ninguna aplicación especial, teniendo solo una configuración de servidor Debian/CentOS predeterminada y sin usar sudo)?
Actualizar:
Entonces abrí la terminal y escribí en ella.límiteMandato: ulimit -v 1000000
que será como 976,6Mb
limitación. Luego llamé ulimit -a
y vi que la limitación estaba "activada". Luego comencé un script bash que compila e inicia mi aplicación en nohup
unlargo 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 biblioteca grande y comenzó a compilarla).
Pero pensé que había aplicado limitaciones al Shell y a todos los procesos iniciados con/desde él ulimit -v 1000000
. ¿Qué me equivoqué? ¿Cómo hacer que una terminal y todos los subprocesos que lanza tengan un uso limitado de RAM?
Respuesta1
ulimit
está hecho para esto. Puede configurar los valores predeterminados ulimit
por usuario o por grupo en
/etc/security/limits.conf
ulimit -v KBYTES
establece el tamaño máximo de memoria virtual. No creo que puedas dar una cantidad máxima de intercambio. Es sólo un límite en la cantidad de memoria virtual que el usuario puede utilizar.
Entonces limits.conf
tendrías la línea (hasta un máximo de 4G
memoria)
luser hard as 4000000
ACTUALIZACIÓN - CGroups
Los límites impuestos por ulimit
y limits.conf
es por proceso. Definitivamente no fui claro en ese punto.
Si desea limitar la cantidad total de memoria que usa un usuario (que es lo que solicitó). quieres usargrupos c.
En /etc/cgconfig.conf
:
group memlimit {
memory {
memory.limit_in_bytes = 4294967296;
}
}
Esto crea una cgroup
que tiene un límite máximo de memoria de 4GiB.
En /etc/cgrules.conf
:
luser memory memlimit/
Esto hará que todos los procesos ejecutados luser
se ejecuten dentro de los memlimit
cgroups creados en cgconfig.conf
.
Respuesta2
cgroups
son la forma correcta de hacer esto, como han señalado otras respuestas. Lamentablemente, no existe 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 se hace que la sesión de inicio de sesión de un usuario forme parte automáticamente de un cgroup varía de un sistema a otro. sombrero rojotiene algunas herramientas, y tambiénsistemad.
memory.memsw.limit_in_bytes
y memory.limit_in_bytes
fijar límites incluyendo y no swap, respectivamente. La desventaja memory.limit_in_bytes
es que cuenta los archivos almacenados en caché por el kernel en nombre de los procesos en el cgroup frente a la cuota del grupo. Menos almacenamiento en caché significa más acceso al disco, por lo que potencialmente estás perdiendo algo de rendimiento si el sistema tuviera algo de memoria disponible.
Por otro lado, memory.soft_limit_in_bytes
permite que el cgroup supere la cuota, pero si se invoca el asesino OOM del kernel, aquellos cgroups que superen sus cuotas serán eliminados primero, lógicamente. La desventaja de esto, sin embargo, 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 que eliminar, en cuyo caso algo podría fallar antes de que se completen los procesos del usuario que excede la cuota. delicado.
ulimit
, sin embargo, no es la herramienta adecuada para ello. ulimit impone límites al uso de la memoria virtual, que casi con seguridad no es lo que usted desea. Muchas aplicaciones del mundo real utilizan mucha más memoria virtual que física. La mayoría de los tiempos de ejecución con recolección 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 utilizar 20 TB de memoria virtual. Asignadores que no dependen de sbrk
, comojemalloc(que es el asignador predeterminado para Rust) otcmalloc, también tendrán un uso de memoria virtual sustancialmente superior a su uso físico. Para mayor eficiencia, muchas herramientas mapean archivos, 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 se intente configurar cuotas de memoria virtual aquí rompería Chrome, obligaría a Chrome a deshabilitar algunas funciones de seguridad que dependen de la asignación (pero no del uso) de grandes cantidades de memoria virtual, o sería completamente ineficaz para evitar que un usuario abuse del sistema. .
Respuesta3
No puede limitar el uso de memoria a nivel de usuario, ulimit puede hacerlo, pero para un solo proceso.
Incluso con el uso de límites por usuario en /etc/security/limits.conf
, un usuario puede usar toda la memoria ejecutando múltiples procesos.
Si realmente desea limitar los recursos, debe utilizar una herramienta de gestión de recursos, comorcapdutilizado por proyectos y zonas bajo Solaris.
Hay algo que parece ofrecer características similares en Linux que podrías investigar:grupos c.
Respuesta4
En un sistema con systemd (por ejemplo, Ubuntu 22.04 que estoy usando), la forma más sencilla de restringir la CPU/Memoria es usar archivos de configuración systemd de cgroups, por ejemplo, para restringir a 4 GB de RAM y 2 subprocesos:
nano /etc/systemd/system/user-.slice.d/50-memory.conf
Y escribe en ese archivo:
[Slice]
MemoryMax=4G
CPUQuota=200%
(corre luego systemctl daemon-reload
para aplicar)
Esto se aplica a todos los usuarios, pero puede anular usuarios individuales en/etc/systemd/system/user-[uid].slice.d/50-memory.conf
(Creo que el nombre del archivo conf no importa pero no estoy seguro)