Du bør bruge cgroups. Monteringspunkter og detaljer er forskellige på distros og kerner. dvs. Debian 7.0 med lagerkerne monterer ikke cgroupfs som standard og har hukommelsessubsystem deaktiveret (folk anbefaler at genstarte med cgroup_enabled=memory), mens openSUSE 13.1 blev leveret med alt det ud af æsken (for det meste på grund af systemd).
Så først og fremmest, opret monteringspunkter og monter cgroupfs, hvis det endnu ikke er gjort af din distro:
mkdir /sys/fs/cgroup/cpu
mount -t cgroup -o cpuacct,cpu cgroup /sys/fs/cgroup/cpu
mkdir /sys/fs/cgroup/memory
mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory
Opret en cgroup:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
Opret en cgroup. Jeg besluttede at ændre cpu-andele . Standardværdien for den er 1024, så at sætte den til 128 vil begrænse cgroup til 11% af alle CPU-ressourcer, hvis der er konkurrenter. Hvis der stadig er gratis cpu-ressourcer, vil de blive givet til mongodump. Du kan også bruge cpuset
for at begrænse antallet af tilgængelige kerner.
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
Tilføj nu PID'er til cgroup, det vil også påvirke alle deres børn.
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
Jeg kører et par tests. Python, der forsøger at tildele en masse medlemmer, blev dræbt af OOM:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
Jeg har også kørt fire uendelige loops og femte i cgroup. Som forventet fik loop, der blev kørt i cgroup, kun omkring 45 % af CPU-tiden, mens resten af dem fik 355 % (jeg har 4 kerner).
Alle disse ændringer overlever ikke genstart!
Du kan tilføje denne kode til et script, der kører mongodump, eller bruge en permanent løsning.