GNU/Linux >> Tutoriels Linux >  >> Linux

Comment limiter les ressources totales (mémoire) d'un processus et de ses enfants

Je ne sais pas si cela répond à votre question, mais j'ai trouvé ce script perl qui prétend faire exactement ce que vous recherchez. Le script implémente son propre système pour appliquer les limites en se réveillant et en vérifiant l'utilisation des ressources du processus et de ses enfants. Il semble être bien documenté et expliqué, et a été mis à jour récemment.

Comme slm l'a dit dans son commentaire, les cgroups peuvent également être utilisés pour cela. Vous devrez peut-être installer les utilitaires de gestion des cgroups, en supposant que vous êtes sous Linux, vous devriez rechercher libcgroups .

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

Assurez-vous que $USER est votre utilisateur.

Votre utilisateur devrait alors avoir accès aux paramètres de mémoire du groupe de contrôle dans /sys/fs/cgroup/memory/myGroup .

Vous pouvez ensuite définir la limite à, disons, 500 Mo, en procédant comme suit :

echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes

Lançons maintenant Vim :

cgexec -g memory:myGroup vim

Le processus vim et tous ses enfants devraient maintenant être limités à l'utilisation de 500 Mo de RAM. Cependant , je pense que cette limite ne s'applique qu'à la RAM et non au swap. Une fois que les processus atteignent la limite, ils commenceront à échanger. Je ne sais pas si vous pouvez contourner ce problème, je ne trouve pas de moyen de limiter l'utilisation de l'échange à l'aide de cgroups.


https://unix.stackexchange.com/a/536046/4319 :

Sur n'importe quelle distribution basée sur systemd, vous pouvez également utiliser les cgroups indirectement via systemd-run. Par exemple. pour votre cas de limitation pdftoppm à 500 Mo de RAM, utilisez :

systemd-run --scope -p MemoryLimit=500M pdftoppm

...


J'ai créé un script qui fait cela, en utilisant cgmanager qui est utilisé dans Ubuntu. Un avantage est que cela ne nécessite pas d'accès root. Notez que la gestion des groupes de contrôle est un peu spécifique à la distribution, donc je ne sais pas si cela fonctionne sur les distributions qui utilisent la gestion des groupes de contrôle systemd.

#!/bin/sh

set -eu

if [ "$#" -lt 2 ]
then
    echo Usage: `basename $0` "<limit> <command>..."
    exit 1
fi

limit="$1"
shift
cgname="limitmem_$$"
echo "limiting memory to $limit (cgroup $cgname) for command [email protected]"

cgm create memory "$cgname" >/dev/null
cgm setvalue memory "$cgname" memory.limit_in_bytes "$limit" >/dev/null
# try also limiting swap usage, but this fails if the system has no swap
cgm setvalue memory "$cgname" memsw.limit_in_bytes "$limit" >/dev/null 2>&1 || true

# spawn subshell to run in the cgroup
set +e
(
set -e
cgm movepid memory "$cgname" `sh -c 'echo $PPID'` > /dev/null
exec "[email protected]"
)
# grab exit code
exitcode=`echo $?`

set -e

echo -n "peak memory used: "
cgm getvalue memory "$cgname" memory.max_usage_in_bytes | tail -1 | cut -f2 -d\"

cgm remove memory "$cgname" >/dev/null
exit $exitcode

utilisation :enregistrer sous limitmem dans votre chemin et rendez-le exécutable. Ensuite, exécutez par ex. limitmem 1G command... . Cela limite la mémoire réellement utilisée. Si cela est atteint, le tueur de MOO tuera le processus ou l'un de ses enfants, mais pas quelque chose d'aléatoire qui n'a rien à voir avec cette commande.


Linux
  1. Comment limiter l'utilisation du processeur d'un processus sous Linux

  2. Linux - Comment vider les tampons et le cache sur un système Linux ?

  3. Comment vérifier la taille totale de la RAM et l'utilisation de la mémoire sous Linux

  4. CentOS / RHEL 6 :Comment limiter les ressources mémoire pour un utilisateur spécifique à l'aide de cgroups

  5. Comment obtenir le pid d'un processus et invoquer kill -9 dessus dans le script shell ?

Comment définir la mémoire Docker et la limite d'utilisation du processeur

Comment utiliser la commande Linux ulimit

Comment trouver l'ID de processus d'un programme et le tuer [Astuce rapide]

Comment trouver le PID et le PPID d'un processus sous Linux

Si je connais le numéro PID d'un processus, comment puis-je obtenir son nom ?

Comment limiter l'utilisation de la mémoire des applications ?