¿Soluciones limitantes de memoria para aplicaciones codiciosas que pueden bloquear el sistema operativo?

32

Yo uso mi computadora para la programación científica. Tiene una buena cantidad 8GBde RAM y 12GBespacio de intercambio. A menudo, a medida que mis problemas se han agravado, excedo toda la RAM disponible. En lugar de fallar (lo que sería preferible), parece que Ubuntu comienza a cargar todo en el intercambio, incluyendo Unity y cualquier terminal abierta. Si no alcanzo un programa de fuga a tiempo, no hay nada que pueda hacer más que esperar: me toma de 4 a 5 minutos cambiar a un símbolo del sistema, por ejemplo.Ctrl-Alt-F2donde puedo matar el proceso ofensivo.

Como mi propia estupidez está fuera del alcance de este foro, ¿cómo puedo evitar que Ubuntu se bloquee por agitación cuando uso toda la memoria disponible de un solo programa ofensivo?

¡Experimento en casa *!

Abra una terminal, inicie pythony si ha numpyinstalado intente esto:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Advertencia: puede tener efectos adversos, monitorear el proceso a través iotopo topmatarlo a tiempo. Si no, nos vemos después de reiniciar.

Enganchado
fuente

Respuestas:

21

El shell incorporado le ulimitpermite restringir los recursos. Para su caso, para limitar el uso de memoria en el shell (y sus hijos), useulimit -v .

Demostración que establece un límite de memoria de 100 MB (100000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Se observa ps uww -C script-name-hereque el uso de python requiere al menos 29 MB de memoria (columna VSZ). El límite de RSS aumenta a medida que su script de Python necesita más memoria, así que adapte esa columna.

Lekensteyn
fuente
1
Lástima que no sabemos cómo se ve la aplicación real. El ulimit como se demuestra impacta todos los procesos que son hijos de ese caparazón. Ni siquiera sabemos si funciona como un demonio o si tiene muchos hijos, lo que complicaría aún más las cosas. Ver coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
¿No hay una interfaz fácil de usar para ulimit y cgroups ? En Windows, cuando el sistema operativo se acerca a quedarse sin RAM, una ventana emergente de advertencia siempre me ha permitido evitar bloqueos del sistema. En Ubuntu, ¿tengo que estar pendiente del uso de memoria todo el tiempo?
Dan Dascalescu
1
@DanDascalescu Si tiene un archivo de intercambio configurado, sufrirá retrasos más largos pero aún podrá trabajar. Una vez que note que comienza el intercambio, puede verificar el uso de RAM en el monitor del sistema. En caso de que su sistema realmente se quede sin memoria, se invoca el asesino de falta de memoria (OOM) que mata un proceso con el puntaje más alto de "maldad" (generalmente el proceso que consume más memoria).
Lekensteyn
12

Cgroups debería permitirle limitar su uso de memoria por proceso.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

La computación científica es notoriamente intensiva en memoria, al colocar su aplicación en un grupo de seguridad, el resto de los procesos no deberían convertirse en víctimas, ya que se aliviará la presión de la memoria.

Alternativamente, una VM podría usarse como una especie de límite estricto, ya que la aplicación solo puede usar la memoria delegada a la máquina virtual, a expensas del rendimiento, por supuesto. Sin embargo, una VM es mucho más fácil de configurar para los no iniciados en comparación con la configuración y el mantenimiento de un cgroup.

Decisiones decisiones :) ¡Buena suerte!

ppetraki
fuente
1
¿No hay una interfaz fácil de usar para ulimit y cgroups? En Windows, cuando el sistema operativo se acerca a quedarse sin RAM, una ventana emergente de advertencia siempre me ha permitido evitar bloqueos del sistema. En Ubuntu, ¿tengo que estar pendiente del uso de memoria todo el tiempo?
Dan Dascalescu
No Además, su sistema operativo tampoco debería congelarse, ese es un problema separado. Para empezar, las ventanas emergentes son solo una venda. Si está utilizando toneladas de memoria, tal vez debería investigar por qué. Por ejemplo, los navegadores modernos con su sanboxing pueden consumir fácilmente 70-150M POR TAB. Apagarlo o sintonizarlo puede liberar una gran cantidad de memoria utilizada regularmente por un usuario final. Se supone que los programadores intercambian programas que rara vez se usan para ahorrar espacio, pero si se despiertan más de lo debido deberían repararlos, o si su tarea principal requiere mucha memoria (web), se necesita más memoria RAM.
ppetraki
8
Sé lo que consume la memoria: Chrome. Pero el sistema operativo debería proteger su estabilidad contra las aplicaciones que se ejecutan sin embargo.
Dan Dascalescu
1
Entiendo de dónde vienes como usuario. Sin embargo, lo que está pidiendo significa convertir una plataforma informática general en un dispositivo. Como el método menos complejo (propenso a errores) que un ingeniero de sistemas operativos debe implementar para proporcionar esas garantías es tomar decisiones drásticamente obstinadas sobre cómo se ejecuta toda la computadora. Eso generalmente viene a expensas de la flexibilidad del usuario final. Ves ejemplos de esto en la informática de tabletas. Sin embargo, en los escritorios se conserva la flexibilidad.
ppetraki