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:
- Vous devez remplacer
<pid>
par l'ID de processus de votre programme.
- Vous devez remplacer
<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 serait top -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:
L'allocateur de mémoire Go réserve une grande région de mémoire virtuelle comme arène pour les allocations. Cette mémoire virtuelle est locale au processus Go spécifique; la réservation ne prive pas d'autres processus de mémoire.
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,
vous permet de faire une gestion manuelle de la mémoire via l'allocateur C standard pour votre système. C'est une mince pellicule au-dessus de malloc, calloc et sans. Voir man malloc pour plus de détails sur ces fonctions pour votre système. Cette bibliothèque utilise cgo.
Le cas d'utilisation est donné comme suit:
Pourquoi voudriez-vous cela?
Lorsqu'un programme provoque une pression mémoire ou que le système manque de mémoire, il peut être utile de contrôler manuellement les allocations et désallocations de mémoire. Go peut vous aider à contrôler les allocations, mais il n'est pas possible de désallouer explicitement les données inutiles.
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.