Este documento proporciona respuestas a preguntas y problemas de diagnóstico comunes.
Si no encuentras la respuesta que buscas, consulta la Lista completa de preguntas frecuentes o publique su pregunta en Comunidad MongoDB.
¿Dónde puedo encontrar información sobre un mongod ¿Proceso que dejó de ejecutarse inesperadamente?
Si se cierra inesperadamente en una plataforma mongod mongod UNIX o basada en UNIX, y si no registra un mensaje de apagado o error, revise los registros del sistema para ver si hay mensajes relacionados con MongoDB. Por ejemplo,/var/log/messages para los registros ubicados en, use los siguientes comandos:
sudo grep mongod /var/log/messages sudo grep score /var/log/messages
¿El tiempo TCP afecta las implementaciones de MongoDB?keepalive
Si experimenta tiempos de espera de red o errores de socket en la comunicación entre clientes y servidores, o entre miembros de un clúster fragmentado o un conjunto de réplicas, verifique el valor de keepalive de TCP para los sistemas afectados.
Muchos sistemas operativos establecen este valor en 7200 segundos (dos horas) de forma predeterminada. En MongoDB, generalmente se obtienen mejores resultados con un valor de keepalive más corto, del orden de 120 segundos (dos minutos).
Si su implementación de MongoDB experimenta problemas relacionados con keepalive, debe modificar el valor de keepalive en todos los sistemas afectados. Esto incluye todas las máquinas mongod mongos que ejecutan procesos o y todas las máquinas que alojan procesos cliente que se conectan a MongoDB.
Ajuste del valor keepalive de TCP:
Para ver la configuración de keepalive en Linux, utilice uno de los siguientes comandos:
sysctl net.ipv4.tcp_keepalive_time O:
cat /proc/sys/net/ipv4/tcp_keepalive_time El valor se mide en segundos.
Nota
Aunque el nombre de la configuración incluye
ipv4, el valortcp_keepalive_timese aplica tanto a IPv4 como a IPv6.Para cambiar el
tcp_keepalive_timevalor, puedes utilizar uno de los siguientes comandos, proporcionando un <value> en segundos:sudo sysctl -w net.ipv4.tcp_keepalive_time=<value> O:
echo <value> | sudo tee /proc/sys/net/ipv4/tcp_keepalive_time Estas operaciones no persisten a través de los reinicios del sistema. Para persistir la configuración, añade la siguiente línea a
/etc/sysctl.conf, proporcionando un <value> en segundos, y reinicia el equipo:net.ipv4.tcp_keepalive_time = <value> Los valores de Keepalive mayores que
300segundos, (5 minutos) serán anulados en los sockets demongodymongosy se establecerán en300segundos.
Para ver la configuración de keepalive en Windows, emita el siguiente comando:
reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime El valor del registro no está presente por defecto. El valor por defecto del sistema, utilizado si el valor está ausente, es
7200000milisegundos o0x6ddd00en hexadecimal.Para cambiar el valor
KeepAliveTime, utilice el siguiente comando en un Administrador Command Prompt, donde<value>se expresa en hexadecimal (por ejemplo,120000es0x1d4c0):reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value> Los usuarios de Windows deberían considerar el artículo de Technet de Windows Server sobre KeepAliveTime para obtener más información sobre cómo configurar keepalive para implementaciones de MongoDB en sistemas Windows. Los valores de keepalive mayores o iguales a 600000 milisegundos (10 minutos) serán ignorados por
mongodymongos.
Para ver la configuración de keepalive en macOS, emita el siguiente comando:
sysctl net.inet.tcp.keepidle El valor se mide en milisegundos.
Para cambiar el
net.inet.tcp.keepidlevalor, puede utilizar el siguiente comando, proporcionando un <value> en milisegundos:sudo sysctl net.inet.tcp.keepidle=<value> Esta operación no persiste tras reinicios del sistema y debe configurarse cada vez. Consulte la documentación de su sistema operativo para obtener instrucciones sobre cómo configurar este valor de forma persistente. Los valores de keepalive mayores o iguales a
600000milisegundos (10 minutos) serán ignorados pormongodmongosy.Nota
En macOS 10.15 Catalina, Apple ya no permite la configuración de la opción
net.inet.tcp.keepidle.
Será necesario reiniciar los procesos y para que las nuevas configuraciones de keepalive en todo el sistema surtan mongod mongos efecto.
¿Los tiempos de espera de retransmisión de TCP afectan las implementaciones de MongoDB?
Si experimenta bloqueos prolongados (bloqueos de más de dos minutos) seguidos de tiempos de espera de red o errores de socket entre clientes y servidores o entre miembros de un clúster fragmentado o un conjunto de réplicas, verifique el valor tcp_retries2 para los sistemas afectados.
La mayoría de los sistemas operativos Linux establecen este valor en 15 por defecto, mientras que Windows lo establece en 5. En MongoDB, se obtienen mejores resultados con un valor tcp_retries2 menor, del orden de 5 (12 segundos) o inferior.
Si su implementación de MongoDB experimenta problemas relacionados con el tiempo de espera de retransmisión TCP, cambie el tcp_retries2 valor (TcpMaxDataRetransmission en Windows) en todos los sistemas afectados. Esto incluye todas las máquinas mongod mongos que ejecutan procesos o y todas las máquinas que alojan procesos cliente que se conectan a MongoDB.
Ajustar el tiempo de espera de retransmisión TCP
En la mayoría de los sistemas operativos Linux, controle la retransmisión TCP ajustando la configuración sysctl net.ipv4.tcp_retries2.
Nota
Aunque el nombre de la configuración incluye ipv4, la configuración tcp_retries2 se aplica tanto a IPv4 como a IPv6.
Para ver la configuración actual, utilice el comando
sysctl:sysctl net.ipv4.tcp_retries2 net.ipv4.tcp_retries = 15 Para cambiar la configuración
tcp_retries2en tiempo de ejecución, utilice el comandosysctl:sysctl -w net.ipv4.tcp_retries2=8 Para que el cambio sea permanente, edite el archivo de configuración:
Abra
/etc/sysctl.confen su editor de texto preferido:vi /etc/sysctl.conf Configure el ajuste
net.ipv4.tcp_retries2:net.ipv4.tcp_retries2 = 8 Reinicie el sistema.
Su sistema ahora utiliza la nueva configuración
tcp_retries2.
En Windows, controle la retransmisión TCP ajustando el parámetro TcpMaxDataRetransmissions.
Para ver la configuración
TcpMaxDataRetransmissionsen Windows, ejecute este comando:reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions De forma predeterminada, el parámetro no está definido. Si no se especifica el valor, el valor predeterminado del sistema es
5reintentos.Para cambiar el valor
TcpMaxDataRetransmissions, utilice el siguiente comando en un Administrador Command Prompt, donde<value>es un entero:reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v TcpMaxDataRetransmission /d <value>
¿Por qué MongoDB registra tantos eventos de "Conexión aceptada"?
Si observa una gran cantidad de mensajes de conexión y reconexión en su registro de MongoDB, significa que los clientes se conectan y desconectan frecuentemente del servidor MongoDB. Este comportamiento es normal en aplicaciones que no utilizan agrupación de solicitudes, como CGI. Considere usar FastCGI, un módulo Apache u otro tipo de servidor de aplicaciones persistente para reducir la sobrecarga de conexión.
Si estas conexiones no afectan el rendimiento, puede utilizar la opción de tiempo de ejecución quiet o la opción de línea de comandos --quiet para suprimir estos mensajes del registro.
¿Qué herramientas están disponibles para monitorear MongoDB?
MongoDB Cloud Manager y Ops Manager, una solución local disponible en MongoDB Enterprise Advanced, incluye una funcionalidad de monitoreo que recopila datos de implementaciones de MongoDB en ejecución y brinda visualización y alertas basadas en esos datos.
Para obtener más información, consulte también la documentación de MongoDB Cloud Manager y la documentación de Ops Manager.
Una lista completa de herramientas de terceros está disponible como parte de la documentación de Monitoreo de una implementación de MongoDB autoadministrada.
Diagnóstico de memoria para el motor de almacenamiento WiredTiger
¿El tamaño de mi conjunto de trabajo debe ajustarse a la RAM?
No.
Si el caché no tiene suficiente espacio para cargar datos adicionales, WiredTiger expulsa páginas del caché para liberar espacio.
Nota
El storage.wiredTiger.engineConfig.cacheSizeGB limita el tamaño de la caché interna de WiredTiger. El sistema operativo utiliza la memoria libre disponible para la caché del sistema de archivos, lo que permite que los archivos de datos comprimidos de MongoDB permanezcan en la memoria. Además, el sistema operativo utiliza cualquier RAM libre para almacenar en búfer los bloques del sistema de archivos y la caché del sistema de archivos.
Para acomodar a los consumidores adicionales de RAM, es posible que debas reducir el tamaño de la caché interna de WiredTiger.
El valor por defecto del tamaño de la caché interna de WiredTiger asume que hay una única instancia de mongod por máquina. Si una sola máquina contiene varias instancias de MongoDB, reduce la configuración para acomodar las otras instancias mongod.
Si ejecuta en un contenedor (por mongod ejemplo,,, lxc cgroupsDocker, etc.) que no tiene acceso a toda la RAM disponible en un sistema, debe establecer storage.wiredTiger.engineConfig.cacheSizeGB o en un valor menor que la cantidad de RAM disponible en el contenedor. La cantidad exacta depende de los demás procesos que se ejecutan en el storage.wiredTiger.engineConfig.cacheSizePct contenedor.memLimitMB Consulte.
Solo puedes proporcionar uno de storage.wiredTiger.engineConfig.cacheSizeGB o storage.wiredTiger.engineConfig.cacheSizePct.
Para ver las estadísticas de caché y desalojo, use el serverStatus comando. El wiredTiger.cache campo contiene la información sobre caché y desalojo.
... "wiredTiger" : { ... "cache" : { "tracked dirty bytes in the cache" : <num>, "bytes currently in the cache" : <num>, "maximum bytes configured" : <num>, "bytes read into cache" :<num>, "bytes written from cache" : <num>, "pages evicted by application threads" : <num>, "checkpoint blocked page eviction" : <num>, "unmodified pages evicted" : <num>, "page split during eviction deepened the tree" : <num>, "modified pages evicted" : <num>, "pages selected for eviction unable to be evicted" : <num>, "pages evicted because they exceeded the in-memory maximum" : <num>,, "pages evicted because they had chains of deleted items" : <num>, "failed eviction of pages that exceeded the in-memory maximum" : <num>, "hazard pointer blocked page eviction" : <num>, "internal pages evicted" : <num>, "maximum page size at eviction" : <num>, "eviction server candidate queue empty when topping up" : <num>, "eviction server candidate queue not empty when topping up" : <num>, "eviction server evicting pages" : <num>, "eviction server populating queue, but not evicting pages" : <num>, "eviction server unable to reach eviction goal" : <num>, "pages split during eviction" : <num>, "pages walked for eviction" : <num>, "eviction worker thread evicting pages" : <num>, "in-memory page splits" : <num>, "percentage overhead" : <num>, "tracked dirty pages in the cache" : <num>, "pages currently held in the cache" : <num>, "pages read into cache" : <num>, "pages written from cache" : <num>, }, ...
Para obtener una explicación de algunas estadísticas de caché de claves y desalojo, como wiredTiger.cache.bytes currently in the cache y,wiredTiger.cache.tracked dirty bytes in the cache wiredTiger.cacheconsulte.
Para ajustar el tamaño de la caché interna de WiredTiger, consulta --wiredTigerCacheSizeGB y storage.wiredTiger.engineConfig.cacheSizeGB. Se debe evitar aumentar el tamaño de la caché interna de WiredTiger por encima de su valor por defecto. Si el caso de uso requiere un aumento del tamaño de la caché interna, consulta --wiredTigerCacheSizePct y storage.wiredTiger.engineConfig.cacheSizePct.
¿Cómo calculo cuánta RAM necesito para mi aplicación?
Con WiredTiger, MongoDB utiliza tanto la caché interna de WiredTiger como la caché del sistema de archivos.
Configuración de caché
El tamaño de caché interno por defecto de WiredTiger es el mayor de los siguientes:
50% de (RAM - 1GB), o
0.256 GB.
Por ejemplo, en un sistema con un total de 4GB de RAM, la caché de WiredTiger usa 1.5GB de RAM (0.5 * (4GB - 1GB) =
1.5 GB). Al proporcionar un tamaño de caché específico, asegúrese de que la RAM no supere los límites de 0.256GB a 10000GB.
Evite aumentar el tamaño de la caché interna de WiredTiger por encima de su valor predeterminado. Si su caso lo requiere, puede usar --wiredTigerCacheSizePct para tener en cuenta los cambios en la memoria debidos a la vertical. Debe especificar un porcentaje de hasta el 80% de la memoria disponible. Los valores calculados pueden variar entre 0.256GB y 10000GB. Por ejemplo, en un sistema con 2GB de RAM, --wiredTigerCacheSizePct no se puede establecer en 10 porque el 10% de 2GB es 0.2 GB, que es menor que 0.256GB.
Nota
En algunos casos, como al ejecutarse en un contenedor configurado para usar menos RAM que la memoria asignada al host, es necesario tener en cuenta los límites. Es posible que deba configurar la caché de WiredTiger con un valor adecuado, ya que WiredTiger podría no tener en cuenta los límites de memoria del contenedor específico en ciertos casos.
Para ver, el valor que WiredTiger utiliza como memory limit hostInfo la cantidad máxima de RAM disponible, utilice el comando.
Por defecto, WiredTiger utiliza la compresión de bloques Snappy para todas las colecciones y la reducción de prefijo para todos los índices. Los valores de compresión por defecto son configurables a nivel global y también pueden establecerse por colección y por índice durante la creación de colecciones e índices.
Se utilizan diferentes representaciones para los datos en la caché interna de WiredTiger frente al formato en disco:
Los datos en la caché del sistema de archivos son idénticos al formato en disco, incluidos los beneficios de cualquier compresión para los archivos de datos. La caché del sistema de archivos es utilizada por el sistema operativo para reducir la E/S del disco.
Los índices cargados en la caché interna de WiredTiger tienen una representación de datos diferente al formato en disco, pero aún pueden aprovechar la reducción de prefijo de índice para reducir el uso de RAM. La reducción de prefijo de índice elimina duplicados de los prefijos comunes de los campos indexados.
Los datos de la colección en la caché interna de WiredTiger están sin comprimir y utilizan una representación diferente al formato en disco. La compresión de bloques puede proporcionar un ahorro significativo de almacenamiento en disco, pero los datos deben ser descomprimidos para que el servidor los manipule.
Con la caché del sistema de archivos, MongoDB utiliza automáticamente toda la memoria libre que no está siendo utilizada por la caché de WiredTiger ni por otros procesos.
Para ajustar el tamaño de la caché interna de WiredTiger, consulta --wiredTigerCacheSizeGB y storage.wiredTiger.engineConfig.cacheSizeGB. Se debe evitar aumentar el tamaño de la caché interna de WiredTiger por encima de su valor por defecto. Si el caso de uso requiere un aumento del tamaño de la caché interna, consulta --wiredTigerCacheSizePct y storage.wiredTiger.engineConfig.cacheSizePct.
Nota
El storage.wiredTiger.engineConfig.cacheSizeGB limita el tamaño de la caché interna de WiredTiger. El sistema operativo utiliza la memoria libre disponible para la caché del sistema de archivos, lo que permite que los archivos de datos comprimidos de MongoDB permanezcan en la memoria. Además, el sistema operativo utiliza cualquier RAM libre para almacenar en búfer los bloques del sistema de archivos y la caché del sistema de archivos.
Para acomodar a los consumidores adicionales de RAM, es posible que debas reducir el tamaño de la caché interna de WiredTiger.
El valor por defecto del tamaño de la caché interna de WiredTiger asume que hay una única instancia de mongod por máquina. Si una sola máquina contiene varias instancias de MongoDB, reduce la configuración para acomodar las otras instancias mongod.
Si ejecuta en un contenedor (por mongod ejemplo,,, lxc cgroupsDocker, etc.) que no tiene acceso a toda la RAM disponible en un sistema, debe establecer storage.wiredTiger.engineConfig.cacheSizeGB o en un valor menor que la cantidad de RAM disponible en el contenedor. La cantidad exacta depende de los demás procesos que se ejecutan en el storage.wiredTiger.engineConfig.cacheSizePct contenedor.memLimitMB Consulte.
Solo puedes proporcionar uno de storage.wiredTiger.engineConfig.cacheSizeGB o storage.wiredTiger.engineConfig.cacheSizePct.
Para ver las estadísticas sobre la caché y la tasa de desalojos, consultar el campo wiredTiger.cache devuelto por el comando serverStatus.
Diagnóstico de clúster fragmentado
Los dos factores más importantes para mantener un clúster fragmentado exitoso son:
Aunque puede cambiar su clave de fragmento más adelante, es importante considerar cuidadosamente su elección para evitar problemas de escalabilidad y rendimiento. Continúe leyendo para conocer los problemas específicos que puede encontrar en un entorno de producción.
En un nuevo clúster fragmentado, ¿por qué todos los datos permanecen en un solo fragmento?
Su clúster debe tener suficientes datos para que la fragmentación sea lógica. La fragmentación funciona migrando fragmentos entre los fragmentos hasta que cada uno tenga aproximadamente la misma cantidad de fragmentos.
El tamaño predeterminado 128 de los fragmentos es de megabytes. MongoDB no iniciará las migraciones hasta que el desequilibrio de fragmentos en el clúster supere el umbral de migración. Este comportamiento ayuda a evitar migraciones innecesarias de fragmentos, que pueden reducir el rendimiento general del clúster.
Si acaba de implementar un clúster fragmentado, asegúrese de tener suficientes datos para que la fragmentación sea efectiva. Si no tiene suficientes datos para crear más de ocho 128 fragmentos de megabytes, todos los datos permanecerán en un solo fragmento. Reduzca el tamaño del fragmento o añada más datos al clúster.
Como problema relacionado, el sistema divide los fragmentos solo al insertar o actualizar. Esto significa que, si configura la fragmentación y no realiza operaciones de inserción y actualización, la base de datos no creará ningún fragmento. Puede esperar a que la aplicación inserte los datos o dividir los fragmentos manualmente.
Por último, si tu clave de partición tiene una cardinalidad baja, es posible que MongoDB no pueda crear suficientes particiones entre los datos.
¿Por qué un fragmento recibiría una cantidad desproporcionada de tráfico en un clúster fragmentado?
En algunas situaciones, un solo fragmento o un subconjunto del clúster recibirá una parte desproporcionada del tráfico y la carga de trabajo. En casi todos los casos, esto se debe a una clave de fragmento que no permite el escalado de escritura de forma eficaz.
También es posible que tenga fragmentos activos. En este caso, podría resolver el problema dividiendo y migrando partes de estos fragmentos.
Es posible que tengas que considerar volver a fragmentar tu colección con una clave de fragmentación diferente para corregir este patrón.
¿Qué puede impedir que un clúster fragmentado se equilibre?
Si acabas de implementar tu clúster particionado, podrías considerar las sugerencias de solución de problemas para un clúster nuevo donde los datos permanecen en una sola partición.
Si el clúster estaba inicialmente equilibrado, pero luego desarrolló una distribución desigual de datos, considere las siguientes posibles causas:
Ha eliminado una cantidad significativa de datos del clúster. Si ha añadido datos adicionales, es posible que su distribución sea diferente según su clave de fragmento.
Su clave de fragmento tiene baja cardinalidad y MongoDB no puede dividir más los fragmentos.
Su conjunto de datos crece a una velocidad mayor a la que el balanceador puede distribuir los datos en el clúster. Esto es poco común y suele deberse a:
una ventana de equilibrio demasiado corta, dada la tasa de crecimiento de los datos.
Una distribución desigual de las operaciones de escritura requiere mayor migración de datos. Es posible que deba elegir una clave de fragmento diferente para resolver este problema.
Mala conectividad de red entre fragmentos, lo que puede provocar migraciones de fragmentos demasiado largas. Investigue la configuración de red y las interconexiones entre fragmentos.
¿Por qué las migraciones de fragmentos afectan el rendimiento del clúster fragmentado?
Si las migraciones afectan el rendimiento de su clúster o aplicación, considere las siguientes opciones, según la naturaleza del impacto:
Si las migraciones solo interrumpen sus clústeres esporádicamente, puede limitar la ventana de balanceo para evitar la actividad de balanceo durante las horas punta. Asegúrese de que haya suficiente tiempo restante para evitar que los datos se desequilibren nuevamente.
Si el equilibrador siempre está migrando fragmentos en detrimento del rendimiento general del clúster:
Es posible que desees intentar reducir el tamaño del fragmento para limitar el tamaño de la migración.
Es posible que su clúster supere su capacidad y que desee intentar agregar uno o dos fragmentos al clúster para distribuir la carga.
También es posible que la clave de su fragmento haga que su aplicación dirija todas las escrituras a un solo fragmento. Este tipo de patrón de actividad puede requerir que el balanceador migre la mayoría de los datos poco después de escribirlos. Quizás deba considerar volver a fragmentar su colección con una clave de fragmento diferente que ofrezca un mejor escalado de escritura.