Как ограничить ресурсы процессора и оперативной памяти для mongodump?

У меня работает сервер mongod. Каждый день я выполняю mongodump, чтобы получить резервную копию. Проблема в том, что mongodump потребует много ресурсов и замедлит работу сервера (который, кстати, уже выполняет некоторые другие тяжелые задачи).

Моя цель - как-то ограничить mongodump, который вызывается в сценарии оболочки.

Благодарю.

1 ответ

Решение

Вы должны использовать 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

Создать группу:

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

Настройте группу. Я решил изменить доли процессора. По умолчанию для него установлено значение 1024, поэтому если установить его на 128, cgroup будет ограничено 11% всех ресурсов ЦП, если есть конкуренты. Если все еще есть свободные ресурсы процессора, они будут переданы mongodump. Вы также можете использовать cpuset ограничить количество ядер, доступных для него.

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

Теперь добавьте PID в группу, это также повлияет на всех их детей.

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

Я провожу пару тестов. Python, который пытается выделить кучу mem, был убит OOM:

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

Я также запустил четыре бесконечных цикла и пятый в cgroup. Как и ожидалось, цикл, который был запущен в cgroup, занимал только около 45% процессорного времени, а остальные - 355% (у меня 4 ядра).

Все эти изменения не переживают перезагрузки!

Вы можете добавить этот код в скрипт, который запускает mongodump, или использовать какое-то постоянное решение.

Другие вопросы по тегам