Powinieneś używać cgroups. Punkty montowania i szczegóły różnią się w dystrybucjach i jądrach. Tj. Debian 7.0 ze standardowym jądrem domyślnie nie montuje cgroupfs i ma wyłączony podsystem pamięci (ludzie radzą restartować za pomocą cgroup_enabled=memory), podczas gdy openSUSE 13.1 jest dostarczane z tym wszystkim po wyjęciu z pudełka (głównie ze względu na systemd).
Przede wszystkim utwórz punkty montowania i montuj cgroupfs, jeśli nie zostało to jeszcze zrobione przez twoją dystrybucję:
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
Utwórz grupę c:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
Skonfiguruj cgroup. Postanowiłem zmienić udziały procesora . Domyślna wartość to 1024, więc ustawienie 128 ograniczy cgroup do 11% wszystkich zasobów procesora, jeśli są konkurenci. Jeśli nadal są wolne zasoby procesora, zostaną one przekazane do mongodump. Możesz także użyć cpuset
aby ograniczyć liczbę dostępnych rdzeni.
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
Teraz dodaj identyfikatory PID do cgroup, wpłynie to również na wszystkie ich dzieci.
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
Przeprowadzam kilka testów. Python, który próbuje alokować paczkę memów, został zabity przez OOM:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
Uruchomiłem też cztery nieskończone pętle i piątą w cgroup. Zgodnie z oczekiwaniami, pętla uruchomiona w cgroup zajęła tylko około 45% czasu procesora, podczas gdy reszta z nich zajęła 355% (mam 4 rdzenie).
Wszystkie te zmiany nie przetrwają ponownego uruchomienia!
Możesz dodać ten kod do skryptu uruchamiającego mongodump lub użyć jakiegoś trwałego rozwiązania.