Je développe un programme en cours; il finit parfois par allouer de très grandes quantités de mémoire (>> 10G sur une machine avec 8G de mémoire physique), ce qui fait que le système ne répond plus. Je souhaite limiter la quantité de mémoire que le processus peut allouer. La façon habituelle de procéder est la suivante:
ulimit -m 4000000 ; ./myprogram
... ce qui devrait tuer mon programme s'il essaie d'utiliser plus de 4 Go de mémoire.
Sous OS X El Capitan, cela semble n'avoir aucun effet; même ulimit -m 1
(limiter tous les programmes à seulement 1 Ko de mémoire!) est inefficace.
Comment puis-je définir une limite supérieure sur la mémoire disponible pour un processus particulier?
macos
el-capitan
command-line
memory
development
cpcallen
la source
la source
ulimit -m
ne fonctionne plus sous Linux (> 2.4.30), maisulimit -v
fonctionne toujours comme prévu. (Commeulimit -m
,ulimit -v
semble également n'avoir aucun effet sur OS X.)Réponses:
Il existe deux approches pour limiter votre utilisation de la mémoire: ex post facto et préemptive. Autrement dit, vous pouvez essayer de tuer votre programme une fois qu'il est devenu trop volumineux, ou vous pouvez le programmer pour ne pas devenir trop volumineux en premier lieu.
Si vous insistez sur l'approche ex post facto, vous pouvez utiliser le script Bash suivant. Ce script trouve d'abord la quantité de mémoire (définie par la "taille de l'ensemble résident") utilisée par le processus avec pid processid, filtre toutes les données non numériques à l'aide de grep et enregistre la quantité en tant que variable n. Le script vérifie ensuite si n est supérieur à votre x spécifié. Si c'est le cas, le processus avec processid pid est tué.
Notez s'il vous plaît:
<pid>
par l'ID de processus de votre programme.<x>
par la taille rss = "resident set size" (c'est-à-dire la taille réelle de la mémoire) que vous ne voulez pas que le programme dépasse.n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi
Si vous voulez que cela s'exécute toutes les y secondes, insérez-le simplement dans une boucle et dites-lui d'attendre y secondes après chaque itération. Vous pouvez également écrire une commande similaire à l'aide de
top
. Votre point de départ seraittop -l 1|grep "<pid>"|awk '{print $10}'
.La réponse de @ kenorb m'a aidé avec mon script
Bien que je crois que cela réponde à la question, à long terme, je pense qu'il est préférable de concevoir une programmation pour adopter une approche préventive en utilisant l'allocation de mémoire manuelle.
Tout d'abord, êtes-vous sûr que l'utilisation de la mémoire est vraiment un problème? La documentation Go indique:
Si vous pensez toujours que vous avez un problème, je vous encourage à gérer manuellement votre mémoire comme cela se fait dans le langage de programmation C. Puisque go est écrit en C, je soupçonnais qu'il y aurait des moyens d'entrer dans la gestion / les allocations de mémoire C, et effectivement il y en a. Voir ce dépôt github qui,
Le cas d'utilisation est donné comme suit:
Cela semble être une meilleure solution à long terme.
Si vous souhaitez en savoir plus sur C (y compris la gestion de la mémoire), le langage de programmation C est la référence standard.
la source