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
y memory.limit_in_bytes
establecer límites que incluyen y no incluyen swap, respectivamente. La desventaja memory.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 dependen sbrk
, 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 .