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 ulimit
avant 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
SIGSTOP
ped 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?
ulimit
pour laquelle.Réponses:
niceload --noswap yourprg est fait pour exactement cette situation: il examine l'activité d'échange:
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 yourprg
fonctionne 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.la source
Oui. Cela se fait assez facilement avec pratiquement n'importe quelle coque moderne.
Vous pouvez utiliser l'
-l
option pour les limites de mémoire verrouillées. Votre processus sera signalé si la limite est dépassée.la source
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.
la source