你应该使用 cgroups。发行版和内核上的挂载点和细节是不同的。 IE。带有股票内核的 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 份额。它的默认值为 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 的脚本中,或使用一些永久解决方案。