Docs Menu
Docs Home
/

UNIX ulimit Configuraciones para implementaciones autogestionadas

La mayoría de los sistemas operativos tipo UNIX, incluidos Linux y macOS, ofrecen maneras de limitar y controlar el uso de recursos del sistema, como subprocesos, archivos y conexiones de red, por proceso y por usuario. Estos límites (o "ulimits") impiden que un solo usuario consuma demasiados recursos del sistema. En ocasiones, estos límites tienen valores predeterminados bajos que pueden causar diversos problemas durante el funcionamiento normal de MongoDB.

mongod y utilizan subprocesos y descriptores de archivos para rastrear conexiones y gestionar operaciones internas. Esta sección describe los patrones generales de uso de recursos para MongoDB. Utilice estas figuras junto con la información de su implementación para determinar mongos la ulimit configuración ideal.

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, incluidas las recopilaciones TTL, la replicación y las comprobaciones de estado del conjunto de réplicas, que pueden requerir varios 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 su instanciamongodse ejecuta como un usuario que también ejecuta varios procesos, o varios procesosmongod, podría experimentar contención por estos recursos. El valor processes (es decir, -u) se refiere al número combinado 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>

ulimit tiene dos tipos:

  • "duro" ulimit: El número máximo de procesos que un usuario puede tener activos simultáneamente. Ningún proceso que no sea root puede aumentarlo.

  • "suave" ulimit: El límite impuesto para una sesión o proceso. Cualquier proceso puede aumentarlo hasta el límite "duro" ulimit.

Importante

Un valor bajo de "soft" ulimit puede causar can't create new thread, closing connection errores si el número de conexiones aumenta demasiado. Establezca ambos ulimit valores a los valores recomendados.

ulimit modifica tanto los valores "duros" como los "flexibles" 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 utilizando el método de instalación brew, el valor recomendado de archivos abiertos se establece automáticamente cuando se inicia MongoDB a través de brew services.

Para los sistemas macOS que ejecutan MongoDB Enterprise o que utilizan el método de instalación TGZ, usa el comando ulimit para establecer el valores recomendados. Consulta la documentación de tu sistema operativo para conocer el procedimiento exacto para cambiar los límites del sistema en 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.

Las siguientes configuraciones son particularmente importantes para mongod las implementaciones mongos y:

  • -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

Reinicia tus instancias mongod y después de cambiar mongos la ulimit configuración para aplicar los cambios.

  • 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 las distribuciones de Linux que usan Upstart, puedes especificar límites dentro de los scripts de servicio si inicias mongod o mongos instancias como servicios de Upstart. Puedes hacerlo usando limit secciones.

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 inicia una instancia mongod o como mongos un systemd servicio, puede especificar límites dentro de la [Service] sección de su archivo de servicio. El archivo de servicio tiene una ubicación /etc/systemd/system/<process-name>.service como.

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 instaló MongoDB a través de un gestor de paquetes como yum o apt, el archivo de servicio instalado como parte de su instalación ya contiene estos valores 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 limita el tamaño de la memoria virtual o residente en un sistema que ejecuta MongoDB, el sistema operativo se niega a respetar las solicitudes de asignación adicionales.
[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