Des solutions limitant la mémoire pour les applications gourmandes qui peuvent faire planter le système d'exploitation?

28

J'utilise mon ordinateur pour la programmation scientifique. Il a un 8GB de RAM et 12GB d'espace de swap. Comme mes problèmes sont devenus plus importants, je dépasse souvent toute la mémoire vive disponible. Plutôt que de planter (ce qui serait préférable), il semblerait qu'Ubuntu commence à tout charger en échange, y compris Unity et tous les terminaux ouverts. Si je ne saisis pas un programme en cours d'exécution à temps, je ne peux rien faire d'autre qu'attendre - cela prend 4 à 5 minutes pour passer à une invite de commande, par exemple. Ctrl-Alt-F2 où je peux tuer le processus incriminé.

Etant donné que ma propre stupidité est hors de portée de ce forum, comment empêcher Ubuntu de tomber en panne lors de l'utilisation de toute la mémoire disponible d'un programme incriminé?

Expérience à domicile *!

Ouvrez un terminal, lancez python et si numpy est installé, 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 vous verrai après votre redémarrage.

    
posée Hooked 10.04.2012 - 18:11
la source

2 réponses

17

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

Configuration d'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

On observe en utilisant ps uww -C script-name-here que python nécessite au moins 29 Mo de mémoire (colonne VSZ). La limite RSS augmente à mesure que votre script python nécessite plus de mémoire, donc adaptez cette colonne.

    
réponse donnée Lekensteyn 10.04.2012 - 18:39
la source
12

Les groupes de contrôle devraient vous permettre de limiter l’utilisation de votre mémoire par processus.

lien

lien

Le calcul scientifique consomme beaucoup de mémoire, en sandboxing votre application dans un groupe de contrôle, le reste des processus ne doit pas devenir les victimes que la pression de la mémoire sera allégée.

Alternativement, une VM peut être utilisée comme une sorte de limite stricte comme l'application ne peut utiliser que la mémoire déléguée à la machine virtuelle, aux frais de performance bien sûr. Cependant, une 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!

    
réponse donnée ppetraki 10.04.2012 - 18:20
la source

Lire d'autres questions sur les étiquettes