Tengo una computadora portátil estándar Linux (prueba Debian), con una partición de intercambio.
Hago muchos experimentos con eso. Algunos de ellos tienen mucha memoria y la forma en que Linux se comporta de manera predeterminada es un problema para mí ... Vamos a dar un ejemplo estúpido:
- Siéntate frente a la computadora portátil
- Abrir una terminal
- Escribe
python
, entoncesa = [0]*100000000
Ahora hay muchas posibilidades de que no tenga suficiente RAM para manejar esa gran lista. Linux llenará la RAM, luego el intercambio y, un par de minutos más tarde, el asesino OOM se activará y matará (casi) servicios aleatorios y, con suerte, si presiona Ctrl + C en el momento oportuno python
, y si el terminal Todavía tenía el foco, la computadora volverá a responder.
Me gustaría imponer algunos límites de memoria para evitar ese intercambio no deseado y rechazar a un proceso el derecho de asignar más memoria de la que tengo (en RAM). Si la demanda de memoria está por debajo de un cierto límite o la raíz la solicita, simplemente elimine el proceso con más memoria de cualquier usuario, excepto la raíz.
ulimit -Sv [mem]
Escucho en la parte de atrás!
Ho Ho! "Usar cgroups
vía cgexec
!" alguien dice en la primera fila!
Sí, tiene razón: estas son realmente muy buenas soluciones. Pero:
- No se aplican en todo el sistema.
- Los límites se establecen por proceso
- Los límites son estáticos, sin tener en cuenta la cantidad real de RAM libre (AFAIK)
- Aquí y allá , dicen que no son realmente una buena solución para imponer límites duros.
Lo que me gustaría es que el núcleo diga: "Usted pertenece al usuario foo (no root), usa mucha memoria y nos quedaremos sin memoria. Lo siento amigo ... ¡muera ahora!"
O: "¿Qué demonios estás haciendo? Necesitas x MB y solo hay y MB disponibles. Sí, SWAP está vacío, pero no tienes la intención de usar el SWAP para hacer tu trabajo sucio, ¿verdad? No, yo ¡Dijo que no! ¡No te recuerdo! ¡Si insistes, morirás! "
overcommit_memory
archivo especial usa RAM + SWAP como memoria utilizable. Todavía voy a cambiar :)
ulimits
es una mala idea, como se muestra en casi todas partes, ya que es una limitación por proceso ... Lo sé :) cgroups
Esto definitivamente es mejor pero carece de algo más general: estoy hablando de mi computadora portátil, pero también posee un servidor de "cálculo" que somos tres para compartir. Si hago cumplir tales límites por usuario, estaré limitado por el peor de los casos, ¿no?
/proc/sys/vm/overcommit_memory
afecta el comportamiento del kernel con poca memoria.