web-dev-qa-db-fra.com

Des solutions de limitation de la mémoire pour les applications gourmandes pouvant faire planter les OS

J'utilise mon ordinateur pour la programmation scientifique. Il possède un 8GB sain de RAM et 12GB d'espace d'échange. Souvent, à mesure que mes problèmes s'aggravent, je dépasse toute la RAM disponible. Plutôt que de planter (ce qui serait préférable), il semble qu'Ubuntu commence à tout charger en swap, y compris Unity et tous les terminaux ouverts. Si je ne détecte pas un programme en fuite à temps, je ne peux rien faire d'autre que d'attendre - il faut 4 à 5 minutes pour passer à une invite de commande, par exemple. Ctrl-Alt-F2 où je peux tuer le processus incriminé.

Étant donné que ma propre stupidité dépasse le cadre de ce forum, comment puis-je empêcher Ubuntu de se bloquer en écrasant lorsque j'utilise toute la mémoire disponible d'un seul programme incriminé?

Expérience à la maison *!

Ouvrez un terminal, lancez python et si vous avez installé numpy, essayez ceci:

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

* Avertissement: peut avoir des effets indésirables, surveillez le processus via iotop ou top pour le tuer à temps. Sinon, je te verrai après ton redémarrage.

32
Hooked

Le shell intégré ulimit vous permet de restreindre les ressources. Dans votre cas, pour limiter l'utilisation de la mémoire dans le shell (et ses enfants), utilisez ulimit -v.

Démonstration définissant une limite de mémoire de 100 Mo (100 000 Ko):

$ 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

ps uww -C script-name-here montre que python nécessite au moins 29 Mo de mémoire (colonne VSZ). La limite RSS augmente lorsque votre script python a besoin de plus de mémoire, adaptez cette colonne.

20
Lekensteyn

Les groupes de contrôle doivent vous permettre de limiter votre utilisation de la mémoire processus par processus.

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

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

L'informatique scientifique est notoirement gourmande en mémoire. En mettant en sandbox votre application dans un groupe de contrôle, le reste des processus ne doit pas devenir une victime, car la pression de la mémoire sera allégée.

Sinon, un VM pourrait être utilisé comme une sorte de limite stricte, car l'application ne peut utiliser que la mémoire déléguée à la machine virtuelle, au détriment des performances. Cependant, un VM est beaucoup plus facile à configurer pour les non-initiés par rapport à la configuration et à la maintenance d'un groupe de contrôle.

Décisions décisions :) Bonne chance!

12
ppetraki