Docs Menu
Docs Home
/

UNIX ulimit Configuración para implementaciones autogestionadas

La mayoría de los sistemas operativos de tipo UNIX, incluidos Linux y macOS, proporcionan maneras de limitar y controlar el uso de los recursos del sistema, como hilos, archivos y conexiones de red, tanto por proceso como por usuario. Estos "ulimits" impiden que un solo usuario consuma demasiados recursos del sistema. A veces, estos límites tienen valores por defecto bajos que pueden causar una serie de problemas durante la Operación normal de MongoDB.

mongod y mongos utilizan hilos y descriptores de archivos para rastrear las conexiones y gestionar las operaciones internas. Esta sección describe los patrones generales de utilización de recursos para MongoDB. Se pueden utilizar estas cifras en combinación con la información real sobre la implementación y el uso para determinar los ajustes ideales de ulimit.

Generalmente, todas las instancias de mongod y mongos:

  • rastrean cada conexión entrante con dos descriptores de archivo y un hilo.

  • rastrean cada hilo interno o pthread como un proceso del sistema.

  • 1 descriptor de archivo para cada archivo de datos en uso por la instancia de mongod.

  • 1 descriptor de archivo para cada archivo de la bitácora utilizado por la instancia de mongod.

  • En los sets de réplicas, cada mongod mantiene una conexión con todos los demás nodos del set.

mongod utiliza subprocesos en segundo plano para varios procesos internos, incluidos colecciones TTL, replicación y verificaciones de estado del set de réplicas, que pueden requerir un pequeño número de recursos adicionales.

Además de los hilos y los descriptores de archivo para las conexiones de los clientes, mongos debe mantener conexiones con todos los servidores de configuración y todas las particiones, lo que incluye a todos los nodos de todos los sets de réplicas.

Para mongos, se deben considerar los siguientes comportamientos:

  • mongos instancias mantienen un pool de conexiones con cada fragmento para que los mongos puedan reutilizar las conexiones y satisfacer rápidamente las solicitudes sin necesidad de crear nuevas conexiones.

  • Se puede limitar el número de conexiones entrantes utilizando la opción de tiempo de ejecución net.maxIncomingConnections. Al restringir el número de conexiones entrantes, se puede evitar un efecto en cascada en el que el mongos crea demasiadas conexiones en las instancias de mongod.

Se puede utilizar el comando ulimit en la indicación del sistema para comprobar los límites del sistema, como en el siguiente ejemplo:

$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 64000
-n: file descriptors 64000
-l: locked-in-memory size (kb) unlimited
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 192276
-q: bytes in POSIX msg queues 819200
-e: max nice 30
-r: max rt priority 65
-N 15: unlimited

ulimit se refiere a las limitaciones por usuario para diversos recursos. Por lo tanto, si la instancia de mongod se ejecuta como un usuario que también está ejecutando múltiples procesos, o múltiples procesos de mongod, se podría observar contención para estos recursos. Además, se debe tener en cuenta que el valor de processes (es decir, -u) se refiere al número total de procesos distintos e hilos de subprocesos.

En Linux, se puede cambiar la configuración de ulimit emitiendo un comando en la siguiente forma:

ulimit -n <value>

Existen ulimit "duros" y "suaves" que afectan al rendimiento de MongoDB. El ulimit "duro" se refiere al número máximo de procesos que un usuario puede tener activos en cualquier momento. Este es el límite: ningún proceso que no sea raíz puede aumentar el ulimit"duro". Por el contrario, el ulimit "suave" es el límite que realmente se aplica a una sesión o proceso, pero cualquier proceso puede aumentarlo hasta el máximo ulimit"duro".

Un ulimit "suave" bajo puede causar errores can't create new thread, closing connection si el número de conexiones crece demasiado. Por esta razón, es extremadamente importante establecer ambos valores de ulimit en los valores recomendados.

ulimit modificará tanto los valores "duros" como "suaves" a menos que se especifiquen los modificadores -H o -S al modificar los valores límite.

Para muchas distribuciones de Linux, se pueden cambiar los valores sustituyendo la opción -n por cualquier valor posible en la salida de ulimit -a.

Después de cambiar la configuración de ulimit, se debe reiniciar el proceso para aprovechar las configuraciones modificadas. En Linux, se puede utilizar el sistema de archivos /proc para ver las limitaciones actuales de un proceso en ejecución.

Dependiendo de la configuración de su sistema y de los ajustes por defecto, cualquier cambio en los límites del sistema realizado utilizando ulimit puede revertirse tras un reinicio del sistema. Se puede consultar la documentación de la distribución y del sistema operativo para obtener más información.

Normalmente se debería empezar mongod usando systemctl, que utiliza la configuración de ulimit:

systemctl start mongod.service

Si no se inicia mongod utilizando systemctl, systemd se anulan algunas de las configuraciones ulimit. Por ejemplo, si se inicia mongod como se muestra en el siguiente comando, entonces se utiliza la configuración de un segmento de usuario (como user-1000.slice) systemd:

mongod --config ~/mongod.conf

Nota

Un segmento de usuario systemd limita los recursos de los procesos del usuario.

Para los sistemas macOS que han instalado MongoDB Community mediante el método de instalación brew, el valor de archivos abiertos recomendado se establece automáticamente cuando inicia MongoDB a través de brew services.

Para los sistemas macOS que ejecutan MongoDB Enterprise o utilizan el método de instalación TGZ, use el comando ulimit para configurar Valores recomendados. Consulte la documentación de su sistema operativo para conocer el procedimiento preciso para cambiar los límites del sistema en los sistemas en ejecución.

Red Hat Enterprise Linux y CentOS 6 y 7 aplican una limitación de proceso máximo independiente, nproc, que anula la configuración de ulimit. Este valor se define en el siguiente archivo de configuración, dependiendo de la versión:

Versión
Valor
Archivo

RHEL / CentOS 7

4096

/etc/security/limits.d/20-nproc.conf

RHEL / CentOS 6

1024

/etc/security/limits.d/90-nproc.conf

Para configurar un valor de nproc para estas versiones, se debe crear un archivo llamado /etc/security/limits.d/99-mongodb-nproc.conf con nuevos valores de soft nproc y hard nproc para aumentar el límite del proceso. Para valores recomendados, se puede consultar Configuraciones ulimit recomendadas.

Con RHEL / CentOS 8, ya no es necesario tener valores de nproc separados. El comando ulimit es suficiente para configurar los valores máximos de proceso requeridos en RHEL / CentOS 8.

Cada implementación puede tener requisitos y configuraciones únicos; sin embargo, los siguientes umbrales y configuraciones son particularmente importantes para las implementaciones de mongod y mongos:

  • -f (tamaño del archivo): unlimited

  • -t (tiempo de CPU): unlimited

  • -v (memoria virtual): unlimited [1]

  • -l (tamaño bloqueado en memoria): unlimited

  • -n (archivos abiertos): 64000

  • -m (tamaño de memoria): unlimited [1] [2]

  • -u (procesos/hilos): 64000

Recuerde siempre reiniciar sus instancias de mongod y mongos después de cambiar la configuración de ulimit para asegurarse de que los cambios surtan efecto.

  • Las conexiones entrantes a una instancia mongod o mongos requieren dos descriptores de archivo.

  • Para la plataforma macOS, el límite de procesos recomendado es 2500, que es el valor máximo configurable para esta plataforma.

Para distribuciones de Linux que usan Upstart, se pueden especificar límites dentro de scripts de servicio si se inician instancias de mongod y/o mongos como servicios de Upstart. Se puede hacer esto usando estrofas limit .

Se deben especificar los ajustes de ulimit recomendados, como en el siguiente ejemplo:

limit fsize unlimited unlimited # (file size)
limit cpu unlimited unlimited # (cpu time)
limit as unlimited unlimited # (virtual memory size)
limit memlock unlimited unlimited # (locked-in-memory size)
limit nofile 64000 64000 # (open files)
limit nproc 64000 64000 # (processes/threads)

Cada limit estrofa establece el límite "suave" al primer valor especificado y el límite "duro" al segundo.

Después de cambiar limit parámetros, se debe garantizar que los cambios surtan efecto reiniciando los servicios de la aplicación, utilizando el siguiente formulario:

restart <service name>

Si se inicia una mongod y/o una mongos instancia como un servicio systemd, se pueden especificar límites dentro de la sección [Service] de su archivo de servicio. El archivo de servicio tiene una ubicación similar a /etc/systemd/system/<process-name>.service.

Se pueden establecer límites mediante las pautas de límite de recursos.

Se deben especificar los ajustes de ulimit recomendados, como en el siguiente ejemplo:

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

Cada directiva de límite systemd establece tanto los límites "duros" como "suaves" para el valor especificado.

Después de cambiar limit parámetros, se debe garantizar que los cambios surtan efecto reiniciando los servicios de la aplicación, utilizando el siguiente formulario:

systemctl restart <service name>

Nota

Si se ha instalado MongoDB a través de un administrador de paquetes como yum o apt, el archivo de servicio instalado como parte de la instalación ya contiene estos valores de ulimit.

Nota

Esta sección se aplica únicamente a los sistemas operativos Linux.

El sistema de archivos /proc almacena los límites por proceso en el objeto del sistema de archivos ubicado en /proc/<pid>/limits, donde <pid> es el PID o identificador del proceso. Puede usar la siguiente función bash para devolver el contenido del objeto limits de un proceso o procesos con un nombre dado:

return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}

Puede copiar y pegar esta función en una sesión de shell actual o cargarla como parte de un script. Llame a la función con una de las siguientes invocaciones:

return-limits mongod
return-limits mongos
return-limits mongod mongos
[1](1, 2) Si se limita el tamaño de la memoria residente o virtual en un sistema que ejecuta MongoDB, el sistema operativo se negará a cumplir con solicitudes adicionales de asignación.
[2] El parámetro -m para ulimit no tiene efecto en los sistemas Linux con versiones del kernel más recientes que la 2.4.30. Se puede omitir -m si se desea.

Volver

Gestionar la salud del clúster particionado con los gestores de verificaciones de estado

En esta página