GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo limitar los recursos totales (memoria) de un proceso y sus hijos

No estoy seguro de si esto responde a su pregunta, pero encontré este script de perl que dice hacer exactamente lo que está buscando. El script implementa su propio sistema para hacer cumplir los límites despertando y verificando el uso de recursos del proceso y sus hijos. Parece estar bien documentado y explicado, y ha sido actualizado recientemente.

Como dijo slm en su comentario, cgroups también se puede usar para esto. Es posible que deba instalar las utilidades para administrar cgroups, suponiendo que esté en Linux, debe buscar libcgroups .

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

Asegúrate de $USER es su usuario.

Su usuario debería tener acceso a la configuración de memoria de cgroup en /sys/fs/cgroup/memory/myGroup .

Luego puede establecer el límite en, digamos, 500 MB, haciendo esto:

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

Ahora ejecutemos Vim:

cgexec -g memory:myGroup vim

El proceso vim y todos sus elementos secundarios ahora deberían limitarse a usar 500 MB de RAM. Sin embargo , creo que este límite solo se aplica a la memoria RAM y no al intercambio. Una vez que los procesos alcancen el límite, comenzarán a intercambiarse. No estoy seguro de si puede solucionar esto, no puedo encontrar una manera de limitar el uso de intercambio usando cgroups.


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

En cualquier distribución basada en systemd, también puede usar cgroups indirectamente a través de systemd-run. P.ej. para su caso de limitar pdftoppm a 500M de RAM, usa:

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

...


Creé un script que hace esto, usando cgmanager que se usa en Ubuntu. Una ventaja es que esto no requiere acceso de root. Tenga en cuenta que la administración de cgroup es un poco específica de la distribución, por lo que no sé si esto funciona en las distribuciones que usan systemd cgroup management.

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

uso:guardar como limitmem en su camino y hacerlo ejecutable. Luego ejecute, p. limitmem 1G command... . Esto limita la memoria realmente utilizada. Si se llega a eso, el asesino OOM matará el proceso o uno de sus hijos, pero no algo aleatorio que no tenga nada que ver con este comando.


Linux
  1. Cómo verificar el tamaño total de RAM y el uso de memoria en Linux

  2. CentOS/RHEL 6:Cómo limitar los recursos de memoria para un usuario específico usando cgroups

  3. ¿Cómo puedo medir el uso de memoria real de una aplicación o proceso?

  4. ¿Cómo limitar el uso de la memoria de la aplicación?

  5. ¿Cómo obtener el pid de un proceso e invocar kill -9 en el script de shell?

Cómo establecer el límite de uso de CPU y memoria de Docker

Cómo usar el comando ulimit de Linux

Cómo encontrar el ID de proceso de un programa y eliminarlo [Consejo rápido]

Cómo encontrar el PID y PPID de un proceso en Linux

Si conozco el número PID de un proceso, ¿cómo puedo obtener su nombre?

¿Cómo se informa el uso de la memoria en Linux?