J'ai un ordinateur portable Linux (test Debian) standard, avec une partition de swap.
Je fais beaucoup d'expériences avec. Certains d'entre eux sont vraiment gourmands en mémoire et la façon dont Linux se comporte par défaut est un problème pour moi ... Donnons un exemple stupide:
- Asseyez-vous devant l'ordinateur portable
- Ouvrez un terminal
- Tapez
python
, puisa = [0]*100000000
Il y a maintenant de grandes chances que vous n'ayez pas assez de RAM pour gérer cette grande liste. Linux remplira la RAM, puis l'échange et, quelques minutes plus tard, le tueur OOM sera déclenché et tuera des services (presque) aléatoires et, espérons-le, si vous appuyez sur Ctrl + C au bon moment python
, et si le terminal avait encore le focus, l'ordinateur redeviendra réactif.
Je voudrais imposer certaines limites de mémoire pour éviter cet échange indésirable et refuser à un processus le droit d'allouer plus de mémoire que je n'en ai (en RAM). Si la demande de mémoire est inférieure à une certaine limite ou demandée par root, il suffit de tuer le processus le plus gourmand en mémoire de tout utilisateur, sauf root.
ulimit -Sv [mem]
J'entends dans le dos!
Ho Ho! "Utiliser cgroups
via cgexec
!" quelqu'un dit au premier rang!
Oui, vous avez raison: ce sont en effet de très bonnes solutions. Mais:
- Ils ne s'appliquent pas à l'ensemble du système
- Les limites sont fixées par processus
- Les limites sont statiques, sans tenir compte de la quantité réelle de RAM libre (AFAIK)
- Ici et là , ils disent que ce n'est pas vraiment une bonne solution pour imposer des limites strictes.
Ce que j'aimerais, c'est que le noyau dise: "Vous appartenez à l'utilisateur foo (pas root), vous utilisez beaucoup de mémoire et nous allons manquer de mémoire. Désolé mec ... meurs maintenant!"
Ou: "Que diable faites-vous? Vous avez besoin de x Mo et il n'y a que y Mo disponibles. Oui, SWAP est vide, mais vous n'avez pas l'intention d'utiliser le SWAP pour faire votre sale boulot, n'est-ce pas? Non, je dit non! Pas de mémoire pour toi! Si tu insistes, tu vas mourir! "
overcommit_memory
fichier spécial utilise RAM + SWAP comme mémoire utilisable. Je vais encore échanger :)
ulimits
c'est une mauvaise idée comme montré presque partout car c'est une limitation par processus ... Je fourche vous savez :) À propos cgroups
, c'est certainement mieux mais il manque quelque chose de plus général: je parle de mon ordinateur portable mais je posséder un serveur de "calcul" que nous sommes trois à partager. Si j'applique de telles limites par utilisateur, je serai limité par le pire des cas, n'est-ce pas?
/proc/sys/vm/overcommit_memory
affecte le comportement du noyau en cas de mémoire faible.