12 votes

Comment puis-je limiter la quantité de mémoire disponible pour un processus ?

Je développe un programme en go ; 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 veux 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 4GB de mémoire.

Sous OS X El Capitan, cela semble n'avoir aucun effet ; même ulimit -m 1 (limitant tous les programmes à seulement 1kB de mémoire !) est inefficace.

Comment puis-je fixer une limite supérieure à la mémoire disponible pour un processus particulier ?

2voto

Evan Rosica Points 315

Il existe deux approches pour limiter l'utilisation de la mémoire : Ex post facto, et préemptive. En d'autres termes, vous pouvez essayer de tuer votre programme après qu'il ait atteint une taille trop importante, ou vous pouvez le programmer pour qu'il n'atteigne pas une taille trop importante en premier lieu.

Si vous insistez sur l'approche ex post facto, vous pouvez utiliser le script de Bash suivant. Ce script trouve d'abord la quantité de mémoire (telle que définie par "resident set size") que le processus avec processid pid utilise, filtre toutes les données non numériques en utilisant grep, et enregistre la quantité comme variable n. Le script vérifie ensuite si n est plus grand que votre x spécifié. Si c'est le cas, le processus avec processid pid est tué.

Veuillez noter :

  1. Vous devez remplacer <pid> avec l'identifiant du processus de votre programme.
  2. Vous devez remplacer <x> avec le 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 qu'elle s'exécute toutes les y secondes, il suffit de l'enfermer dans une boucle et de lui dire d'attendre y secondes après chaque itération. Vous pouvez également écrire une commande similaire en utilisant top . Votre point de départ serait top -l 1|grep "<pid>"|awk '{print $10}' .

@kenorb's réponse m'a aidé avec mon script


Bien que je pense que cela réponde à la question, je crois qu'à long terme, une meilleure conception de programmation consiste à adopter une approche préemptive en utilisant l'allocation manuelle de la mémoire.

Tout d'abord, êtes-vous sûr que l'utilisation de la mémoire est vraiment un problème ? Le logiciel Go documentation États :

L'allocateur de mémoire de 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 les autres processus de mémoire.

Si vous pensez toujours avoir un problème, je vous encourage alors à gérer manuellement votre mémoire comme cela se fait dans le langage de programmation C. Puisque go est écrit en C, je me doutais qu'il y aurait des moyens de pénétrer dans la gestion/allocation de la mémoire en C, et c'est effectivement le cas. Voir ceci github dépôt qui,

vous permet d'effectuer une gestion manuelle de la mémoire via l'allocateur C standard de votre système. C'est une enveloppe fine au-dessus de malloc, calloc et free de . 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 voulez-vous cela ?

Lorsqu'un programme provoque une pression sur la mémoire ou que le système manque de mémoire, il peut être utile de contrôler manuellement les allocations et les 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 voulez en savoir plus sur le C (y compris la gestion de la mémoire), Le langage de programmation C est la référence standard.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X