Est-il possible d'imposer une sorte de limite souple à la consommation de mémoire des processus?

10

Je pense que ce n'est pas un problème si rare: un processus alloue des quantités massives de mémoire (que ce soit en raison d'un bug de fuite de mémoire, car vous essayez de traiter un fichier d'entrée incroyablement volumineux, ou autre). La RAM se remplit et à un moment donné, Linux doit basculer pour échanger. Eh bien, parfois ce n'est que le dernier recours: si j'ai un calcul coûteux, je ne veux pas perdre de données si vers la fin je manque de RAM.

Plus souvent cependant (selon mon expérience), la consommation de mémoire est illimitée, par un processus voyou, peut-être buggé. C'est-à-dire que je ne me retrouve pas seulement avec des données moins urgentes déplacées pour l'échange, mais le système d'exploitation est obligé d'échanger des charges de données de manière panique. Et cela, malheureusement, n'interrompt pas seulement le processus incriminé, mais peut également entraîner la quasi-totalité du système (ce n'est plus aussi mauvais sur les machines avec SSD, mais OTOH, cela me fait me demander si l'écriture de gigaoctets et de gigaoctets de données poubelles peut nuire à long terme aux cellules flash).
Jusqu'à ce que je remarque le problème et que je tue manuellement le processus (une fois que cela a pris quelques minutes avant que je ne me connecte à un terminal virtuel!), La moitié de ma session de course est en swap, et je dois attendre un bon moment jusqu'à ce que le système fonctionne correctement encore.

Il existe une solution draconique au problème: appliquer une limite de mémoire dure. Mais faire cela à l'échelle du système tuerait parfois des processus dont j'ai plutôt besoin, et si je dois le faire manuellement ulimitavant de commencer un processus offensant ... eh bien, j'oublierai souvent jusqu'à ce qu'il soit trop tard.

Types de solutions possibles Je serais plus satisfait de:

  • Si un processus dépasse une certaine utilisation de la mémoire, il est artificiellement limité afin que le reste du système reste réactif.
  • Si un processus dépasse une certaine utilisation de la mémoire, c'est SIGSTOPped donc j'ai le temps de comprendre quoi faire ensuite.
  • Si un processus approche de la limite de RAM, je reçois un avertissement avant le début du grand échange.

Existe-t-il un moyen d'obtenir un tel comportement, ou similaire?

à gauche
la source
2
Vous pouvez limiter la quantité de RAM utilisée par un processus ou un groupe de processus, à l'aide de cgroups. stackoverflow.com/questions/3043709/…
Mark Plotnick
2
C'est littéralement le genre de chose exacte ulimitpour laquelle.
DopeGhoti
1
Ulimit -m serait la chose à utiliser, sauf qu'il n'a pas fonctionné sur Linux depuis 2.4.30, et ne fonctionnait que dans certaines situations avant cela. unix.stackexchange.com/questions/129587/…
Mark Plotnick
niceload --noswap yourprg
Ole Tange

Réponses:

6

niceload --noswap yourprg est fait pour exactement cette situation: il examine l'activité d'échange:

  • Si échange: laissez le processus s'exécuter
  • Si échange: laissez le processus s'exécuter
  • En cas de permutation interne et externe: suspendre le processus jusqu'à ce que le permutation s'arrête et reprendre le processus une fois le permutation terminée

Il ne suspend pas le processus avant le début de l'échange, mais permet à l'échange de s'exécuter pendant 1 seconde avant d'agir.

niceload --mem 1G yourprgfonctionne de la même manière: si moins de 1 Go est gratuit, youprg est suspendu. Lorsque plus de 1 Go est gratuit, votre programme reprend.

Ole Tange
la source
0

Oui. Cela se fait assez facilement avec pratiquement n'importe quelle coque moderne.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Vous pouvez utiliser l' -loption pour les limites de mémoire verrouillées. Votre processus sera signalé si la limite est dépassée.

mikeserv
la source
-1

Cronjob pour vider le cache: Comment vider le cache de la mémoire sous Linux

J'ai en fait des problèmes similaires. J'ai un groupe d'utilisateurs qui exécute leurs propres scripts personnalisés et de temps en temps leurs scripts consomment toute la mémoire disponible et mettent le serveur redhat hors service. La raison de la consommation massive de RAM est que leurs scripts peuvent s'exécuter pendant des jours en attendant un événement, monopolisant ainsi des ressources alors qu'en réalité il n'en utilise aucun. Donc, ce que j'ai fait, c'est simplement forcer le cache avec un cronjob et je n'ai plus eu de problème depuis.

Simple et paresseux.

D.Zou
la source
Hm. Suggestion intéressante, même si je crains qu'elle ne fasse rien pour la plupart des problèmes que je rencontre. Mon problème principal concerne les processus uniques (applications scientifiques) qui peuvent allouer rapidement de nombreux gigaoctets de mémoire.
leftaroundabout
La suppression des caches introduit généralement des problèmes de performances. Très rarement, ils résolvent des problèmes de performances. Mais ils n'entraîneront pas la mémoire disponible lorsqu'elle n'est pas là.
Gilles 'SO- arrête d'être méchant'