MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como limitar os recursos de CPU e RAM para mongodump?


Você deve usar cgroups. Pontos de montagem e detalhes são diferentes em distros e kernels. Ou seja O Debian 7.0 com kernel padrão não monta o cgroupfs por padrão e tem o subsistema de memória desabilitado (as pessoas aconselham a reinicializar com cgroup_enabled=memory) enquanto o openSUSE 13.1 vem com tudo isso fora da caixa (devido ao systemd principalmente).

Então, antes de tudo, crie pontos de montagem e monte o cgroupfs se ainda não tiver sido feito pela sua 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

Crie um cgrupo:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell

Configure um cgroup. Decidi alterar compartilhamentos de CPU . O valor padrão para ele é 1024, portanto, configurá-lo para 128 limitará o cgroup a 11% de todos os recursos da CPU, se houver concorrentes. Se ainda houver recursos de CPU gratuitos, eles serão fornecidos ao mongodump. Você também pode usar cpuset para limitar o número de núcleos disponíveis para ele.
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes

Agora adicione PIDs ao cgroup, isso também afetará todos os seus filhos.
echo 13065 >  /sys/fs/cgroup/cpu/shell/tasks
echo 13065 >  /sys/fs/cgroup/memory/shell/tasks

Eu corro alguns testes. Python que tenta alocar um monte de mem foi morto por OOM:
[email protected]:~$ python -c 'l = range(3000000)'
Killed

Eu também executei quatro loops infinitos e o quinto no cgroup. Como esperado, o loop que foi executado no cgroup obteve apenas cerca de 45% do tempo de CPU, enquanto o restante deles obteve 355% (tenho 4 núcleos).

Todas essas mudanças não sobrevivem à reinicialização!

Você pode adicionar esse código a um script que execute o mongodump ou usar alguma solução permanente.