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

32

J'utilise mon ordinateur pour la programmation scientifique. Il a beaucoup 8GBde RAM et 12GBd’espace de swap. Souvent, à mesure que mes problèmes s'aggravent, je dépasse toute la mémoire 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 - cela prend 4 à 5 minutes pour passer à une invite de commande, par exemple. Ctrl-Alt-F2où 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 tomber en panne via une compression lorsque j'utilise toute la mémoire disponible d'un seul programme incriminé?

Expérience à la maison *!

Ouvrez un terminal, lancez pythonet si vous avez numpyinstallé, 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 iotopou toppour le tuer à temps. Sinon, je te verrai après ton redémarrage.

Accroché
la source

Réponses:

21

Le shell intégré ulimitvous 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.

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

Il est observé en utilisant ps uww -C script-name-hereque python nécessite au moins 29 Mo de mémoire (colonne VSZ). La limite RSS augmente au fur et à mesure que votre script python a besoin de plus de mémoire, adaptez cette colonne.

Lekensteyn
la source
1
Dommage, nous ne savons pas à quoi ressemble l'application. L'ulimit tel que démontré affecte tous les processus qui sont les enfants de cette coquille. Nous ne savons même pas s'il fonctionne comme un démon ou s'il a beaucoup d'enfants, ce qui compliquerait les choses. Voir coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
N'y a-t-il pas de front-end convivial pour ulimit et cgroups ? Sous Windows, lorsque le système d'exploitation est sur le point de manquer de RAM, un avertissement contextuel m'a toujours permis d'éviter le blocage du système. Sous Ubuntu, dois-je surveiller l'utilisation de la mémoire tout le temps?
Dan Dascalescu
1
@DanDascalescu Si vous avez un fichier d'échange configuré, vous risquez des retards plus longs, mais vous pourrez quand même travailler. Une fois que le swapping commence, vous pouvez vérifier l'utilisation de la RAM par le moniteur du système. Si votre système manque vraiment de mémoire, le tueur de mémoire insuffisante (MOO) est invoqué, ce qui tue un processus dont le score de «méchanceté» est le plus élevé (généralement le processus qui consomme le plus de mémoire).
Lekensteyn
12

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.

Alternativement, une machine virtuelle pourrait être utilisée 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, une machine virtuelle est beaucoup plus facile à configurer pour les non-initiés que la configuration et la maintenance d'un groupe de contrôle.

Décisions décisions :) Bonne chance!

Ppetraki
la source
1
N'y a-t-il pas de front-end convivial pour ulimit et cgroups? Sous Windows, lorsque le système d'exploitation est sur le point de manquer de RAM, un avertissement contextuel m'a toujours permis d'éviter le blocage du système. Sous Ubuntu, dois-je surveiller l'utilisation de la mémoire tout le temps?
Dan Dascalescu
Nan. De plus, votre système d'exploitation ne devrait pas être gelé non plus, c'est un problème distinct. Les fenêtres qui s'ouvrent ne sont qu'un pansement. Si vous utilisez des tonnes de mémoire, vous devriez peut-être rechercher pourquoi? Par exemple, les navigateurs modernes avec leur sanboxing peuvent facilement consommer entre 70 et 150 millions de dollars par tabulation. Le désactiver ou le régler peut libérer une importante quantité de mémoire utilisée régulièrement par un utilisateur final. Les planificateurs sont supposés échanger les programmes rarement utilisés pour économiser de l'espace, mais s'ils doivent se réveiller plus qu'ils ne le devraient, vous devez les réparer ou si votre tâche principale nécessite beaucoup de mémoire (Web), vous avez besoin de plus de RAM.
ppetraki
8
Je sais ce qui consomme de la mémoire - Chrome. Mais le système d'exploitation devrait protéger sa stabilité contre les applications qui fonctionnent mal.
Dan Dascalescu
1
Je comprends d'où vous venez en tant qu'utilisateur. Ce que vous demandez, cependant, signifie transformer une plate-forme informatique générale en un appareil. En tant que méthode la moins complexe (sujette aux erreurs) qu'un ingénieur du système d'exploitation doit mettre en œuvre pour fournir ces garanties, elle consiste à prendre des décisions radicalement fondées sur le mode d'utilisation de l'ordinateur. Cela se fait généralement au détriment de la flexibilité de l'utilisateur final. Vous voyez des exemples de cela en informatique tablette. Dans les ordinateurs de bureau cependant, la flexibilité est préservée.
Ppetraki