如何限制mongodump的CPU和RAM资源?

时间:2015-01-27 10:23:23

标签: linux mongodb mongodump

我正在运行一个mongod服务器。每天,我都在执行mongodump以备份。问题是mongodump将占用大量资源,它会减慢服务器的速度(顺便说一下,已经运行了一些其他繁重的任务)。

我的目标是以某种方式限制在shell脚本中调用的mongodump。

感谢。

1 个答案:

答案 0 :(得分:3)

你应该使用cgroups。发行版和内核的挂载点和细节不同。即带有库存内核的Debian 7.0默认情况下不挂载cgroupfs并禁用内存子系统(人们建议使用cgroup_enabled = memory重新启动),而openSUSE 13.1随附所有开箱即用(主要由于systemd)。

首先,如果您的发行版尚未完成,请创建挂载点并挂载cgroupfs:

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

创建一个cgroup:

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

设置cgroup。我决定改变 cpu shares 。它的默认值是1024,因此如果有竞争对手,将其设置为128会将cgroup限制为所有CPU资源的11%。如果还有免费的cpu资源,他们将被授予mongodump。您还可以使用cpuset来限制可用的核心数量。

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

现在将PID添加到cgroup,它也会影响他们所有的孩子。

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

我进行了几次测试。试图分配大量内存的Python被OOM杀死:

myaut@zenbook:~$ python -c 'l = range(3000000)'
Killed

我还在cgroup中运行了四个无限循环和第五个循环。正如预期的那样,在cgroup中运行的循环只占用了大约45%的CPU时间,而其余的则达到了355%(我有4个核心)。

所有更改都无法在重新启动后继续存在!

您可以将此代码添加到运行mongodump的脚本中,或使用一些永久解决方案。