MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak ograniczyć zasoby procesora i pamięci RAM dla mongodump?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. PyMongo podnosi [errno 49] nie może przypisać żądanego adresu po dużej liczbie zapytań

  2. Wersjonowanie obiektów Java MongoDB

  3. Łączenie Django +1.10 z MongoDB

  4. Golang / MGO -- panika:brak osiągalnych serwerów

  5. Aplikacja Meteor — resetowanie bazy danych wdrożonej aplikacji