GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana membatasi total sumber daya (memori) dari suatu proses dan anak-anaknya

Saya tidak yakin apakah ini menjawab pertanyaan Anda, tetapi saya menemukan skrip perl ini yang mengklaim melakukan apa yang Anda cari. Skrip mengimplementasikan sistemnya sendiri untuk menegakkan batasan dengan membangunkan dan memeriksa penggunaan sumber daya dari proses dan anak-anaknya. Tampaknya didokumentasikan dan dijelaskan dengan baik, dan telah diperbarui baru-baru ini.

Seperti yang dikatakan slm dalam komentarnya, cgroup juga dapat digunakan untuk ini. Anda mungkin harus menginstal utilitas untuk mengelola cgroup, dengan asumsi Anda menggunakan Linux, Anda harus mencari libcgroups .

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

Pastikan $USER adalah pengguna Anda.

Pengguna Anda kemudian harus memiliki akses ke pengaturan memori cgroup di /sys/fs/cgroup/memory/myGroup .

Anda kemudian dapat menetapkan batas, katakanlah 500 MB, dengan melakukan ini:

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

Sekarang mari jalankan Vim:

cgexec -g memory:myGroup vim

Proses vim dan semua turunannya sekarang harus dibatasi untuk menggunakan RAM 500 MB. Namun , menurut saya batasan ini hanya berlaku untuk RAM dan bukan swap. Setelah proses mencapai batas, mereka akan mulai bertukar. Saya tidak yakin apakah Anda dapat menyiasatinya, saya tidak dapat menemukan cara untuk membatasi penggunaan swap menggunakan cgroups.


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

Pada distro berbasis systemd apa pun, Anda juga dapat menggunakan cgroups secara tidak langsung melalui systemd-run. Misalnya. untuk kasus Anda membatasi pdftoppm hingga 500M RAM, gunakan:

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

...


Saya membuat skrip yang melakukan ini, menggunakan cgmanager yang digunakan di Ubuntu. Salah satu keuntungannya adalah ini tidak memerlukan akses root. Perhatikan bahwa manajemen cgroup agak spesifik untuk distro, jadi saya tidak tahu apakah ini berfungsi pada distro yang menggunakan manajemen cgroup 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

penggunaan:simpan sebagai limitmem di jalur Anda dan membuatnya dapat dieksekusi. Kemudian jalankan mis. limitmem 1G command... . Ini membatasi memori yang sebenarnya digunakan. Jika itu tercapai, pembunuh OOM akan mematikan proses atau salah satu anaknya, tetapi bukan sesuatu yang acak yang tidak ada hubungannya dengan perintah ini.


Linux
  1. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  2. Centos – Bagaimana Membatasi Bandwidth yang Digunakan Oleh Suatu Proses?

  3. CentOS / RHEL 6:Cara membatasi sumber daya memori untuk pengguna tertentu menggunakan cgroups

  1. Bagaimana saya bisa mengukur penggunaan memori sebenarnya dari suatu aplikasi atau proses?

  2. Bagaimana cara hibernasi suatu proses di Linux dengan menyimpan memorinya ke disk dan mengembalikannya nanti?

  3. Bagaimana cara memulai proses dalam grup prosesnya sendiri?

  1. Bagaimana cara membatasi penggunaan memori aplikasi?

  2. Bagaimana cara mendapatkan pid dari suatu proses dan mengaktifkan kill -9 di skrip Shell?

  3. Bagaimana cara mengubah semua utas (dan anak-anak) dari satu proses di Linux?