Même si vous pouvez limiter la mémoire pour des applications spécifiques sous MacOS, vous n'obtiendrez pas le résultat escompté :
Le problème est que lorsque vous limitez la quantité de mémoire dont une application peut disposer, cela signifie concrètement que les programmes vont se planter lorsqu'ils atteignent cette limite.
Vous avez donc essentiellement le choix d'avoir des programmes qui se plantent ou de les mettre en pause lorsqu'ils atteignent la limite. Pour les mettre en pause, vous devez implémenter un programme pour le faire vous-même (pas très complexe, mais vous aurez besoin d'une certaine expérience en matière de script ou de programmation).
En termes simples, les limites de mémoire ne vont pas vous aider plus que le simple fait d'abandonner un ou deux de ces porcs lorsque vous avez besoin de faire autre chose.
MISE À JOUR : Dans les commentaires, vous avez écrit que cela ne vous dérangerait pas de faire planter des applications, et que vous êtes un ingénieur logiciel accompli, donc que vous seriez capable de faire du scripting/programmation vous-même.
Dans ce cas, vous pouvez mettre en œuvre une limite de mémoire de différentes manières :
Version la plus simple
Le plus simple serait de créer un petit script qui exécute périodiquement ps x -o rss -p $PID | tail -n1
pour observer l'utilisation de la mémoire de l'ID du processus indiqué. Ceci saisit la taille de l'ensemble résident, mais vous pourriez, pour une raison étrange, vouloir utiliser vsz
au lieu de rss
pour obtenir la vsize à la place.
Si l'utilisation de la mémoire observée est supérieure à un seuil que vous spécifiez, vous pouvez alors mettre fin au processus. La meilleure façon de le faire est d'exécuter une commande telle que kill -15 $PID
et ensuite après un certain temps kill -9 $PID
. Le premier est SIGTERM ce qui indique au processus de commencer à se fermer de lui-même. Ce dernier est SIGKILL qui tue le processus s'il refuse de se fermer de lui-même.
Version avancée
Une version un peu plus avancée consiste à créer un petit programme enveloppe qui appelle setrlimit()
pour fixer une limite au processus, comme par exemple RLIMIT_DATA (taille maximale du segment de données) ou RLIMIT_RSS (taille maximale de l'ensemble des résidents). Ensuite, il doit appeler execl()
ou similaire pour lancer l'application pour laquelle vous souhaitez limiter l'utilisation de la mémoire.
Notez qu'il y a également la possibilité d'utiliser ulimit au lieu de rlimit Cependant, d'après mon expérience, ces limites ne sont pas respectées sur les MacOS actuels.