sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo limitar los recursos de CPU y RAM para mongodump?

Deberías usar cgroups. Los puntos de montaje y los detalles son diferentes en las distribuciones y en los kernels. Es decir. Debian 7.0 con kernel estándar no monta cgroupfs de manera predeterminada y tiene el subsistema de memoria deshabilitado (la gente recomienda reiniciar con cgroup_enabled=memory) mientras que openSUSE 13.1 se envió con todo eso listo para usar (debido principalmente a systemd).

En primer lugar, cree puntos de montaje y monte cgroupfs si su distribución aún no lo ha hecho:

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

Crear un grupo c:

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

Configura un grupo c. Decidí alterar cuotas de CPU . El valor predeterminado es 1024, por lo que configurarlo en 128 limitará cgroup al 11 % de todos los recursos de la CPU, si hay competidores. Si todavía hay recursos de CPU libres, se entregarán a mongodump. También puede usar cpuset para limitar el número de núcleos disponibles.

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

Ahora agregue PID al cgroup, también afectará a todos sus hijos.

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

Hago un par de pruebas. Python que intenta asignar un montón de mem fue asesinado por OOM:

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

También ejecuté cuatro bucles infinitos y el quinto en cgroup. Como era de esperar, el bucle que se ejecutó en cgroup obtuvo solo alrededor del 45 % del tiempo de CPU, mientras que el resto obtuvo el 355 % (tengo 4 núcleos).

¡Todos los cambios no sobreviven al reinicio!

Puede agregar este código a un script que ejecute mongodump o usar alguna solución permanente.