MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come limitare le risorse di CPU e RAM per mongodump?

Dovresti usare cgroups. I punti di montaggio e i dettagli sono diversi su distribuzioni e kernel. Cioè. Debian 7.0 con kernel stock non monta cgroupfs per impostazione predefinita e ha il sottosistema di memoria disabilitato (la gente consiglia di riavviare con cgroup_enabled=memory) mentre openSUSE 13.1 viene fornito con tutto ciò che è fuori dagli schemi (a causa principalmente di systemd).

Quindi, prima di tutto, crea punti di montaggio e monta cgroupfs se non è ancora stato fatto dalla tua distribuzione:

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

Crea un cgroup:

mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell

Crea un cgroup. Ho deciso di modificare le condivisioni della CPU . Il valore predefinito per esso è 1024, quindi impostarlo su 128 limiterà cgroup all'11% di tutte le risorse della CPU, se ci sono concorrenti. Se ci sono ancora risorse CPU gratuite, queste verranno assegnate a mongodump. Puoi anche usare cpuset per limitare il numero di core disponibili.

echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes

Ora aggiungi i PID al cgroup, influirà anche su tutti i loro figli.

echo 13065 >  /sys/fs/cgroup/cpu/shell/tasks
echo 13065 >  /sys/fs/cgroup/memory/shell/tasks

Eseguo un paio di test. Python che tenta di allocare un mucchio di mem è stato ucciso da OOM:

[email protected]:~$ python -c 'l = range(3000000)'
Killed

Ho anche eseguito quattro loop infiniti e il quinto in cgroup. Come previsto, il ciclo eseguito in cgroup ha ottenuto solo il 45% circa del tempo di CPU, mentre il resto ha ottenuto il 355% (ho 4 core).

Tutte le modifiche non sopravvivono al riavvio!

Puoi aggiungere questo codice a uno script che esegue mongodump o utilizzare una soluzione permanente.