GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man die Gesamtressourcen (Speicher) eines Prozesses und seiner Kinder begrenzt

Ich bin mir nicht sicher, ob dies Ihre Frage beantwortet, aber ich habe dieses Perl-Skript gefunden, das behauptet, genau das zu tun, wonach Sie suchen. Das Skript implementiert sein eigenes System zur Durchsetzung der Grenzen, indem es den Ressourcenverbrauch des Prozesses und seiner untergeordneten Prozesse aufweckt und überprüft. Es scheint gut dokumentiert und erklärt zu sein und wurde kürzlich aktualisiert.

Wie slm in seinem Kommentar sagte, können dafür auch cgroups verwendet werden. Möglicherweise müssen Sie die Dienstprogramme zum Verwalten von Cgroups installieren, vorausgesetzt, Sie verwenden Linux, und Sie sollten nach libcgroups suchen .

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

Stellen Sie sicher, dass $USER ist Ihr Benutzer.

Ihr Benutzer sollte dann Zugriff auf die Cgroup-Speichereinstellungen in /sys/fs/cgroup/memory/myGroup haben .

Sie können dann das Limit auf beispielsweise 500 MB festlegen, indem Sie Folgendes tun:

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

Lassen Sie uns nun Vim ausführen:

cgexec -g memory:myGroup vim

Der vim-Prozess und alle seine Kinder sollten jetzt auf die Verwendung von 500 MB RAM beschränkt sein. Allerdings , ich denke, diese Grenze gilt nur für RAM und nicht für Swap. Sobald die Prozesse das Limit erreichen, beginnen sie mit dem Austausch. Ich bin mir nicht sicher, ob Sie dies umgehen können, ich kann keine Möglichkeit finden, die Swap-Nutzung mithilfe von cgroups einzuschränken.


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

Auf jeder systemd-basierten Distribution können Sie cgroups auch indirekt über systemd-run verwenden. Z.B. für Ihren Fall der Begrenzung von pdftoppm bis 500 MB RAM, verwenden Sie:

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

...


Ich habe ein Skript erstellt, das dies tut, indem ich cgmanager verwende, der in Ubuntu verwendet wird. Ein Vorteil ist, dass hierfür kein Root-Zugriff erforderlich ist. Beachten Sie, dass die Cgroup-Verwaltung ein wenig Distributions-spezifisch ist, daher weiß ich nicht, ob dies bei Distributionen funktioniert, die systemd Cgroup-Verwaltung verwenden.

#!/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

Verwendung:Speichern unter limitmem in Ihren Pfad und machen Sie es ausführbar. Dann laufe z.B. limitmem 1G command... . Diese begrenzen den tatsächlich genutzten Speicher. Wenn das erreicht ist, wird der OOM-Killer den Prozess oder eines seiner Kinder töten, aber nichts Zufälliges, das nichts mit diesem Befehl zu tun hat.


Linux
  1. So begrenzen Sie die CPU-Auslastung eines Prozesses in Linux

  2. Linux – Wie leert man die Puffer und den Cache auf einem Linux-System?

  3. Linux – Wie entscheidet der Oom-Killer, welcher Prozess zuerst getötet wird?

  4. CentOS / RHEL 6 :So begrenzen Sie Speicherressourcen für einen bestimmten Benutzer mithilfe von cgroups

  5. Wie kann man einen Prozess in Linux in den Ruhezustand versetzen, indem man seinen Speicher auf der Festplatte speichert und später wiederherstellt?

So legen Sie das Docker-Speicher- und CPU-Nutzungslimit fest

So verwenden Sie den ulimit-Linux-Befehl

So finden Sie die Prozess-ID eines Programms und beenden es [Kurztipp]

So finden Sie die PID und PPID eines Prozesses in Linux

Wenn ich die PID-Nummer eines Prozesses kenne, wie erhalte ich seinen Namen?

Wie kann man alle Threads (und untergeordneten Elemente) eines Prozesses unter Linux neu erstellen?