Todos los productos
Search
Centro de documentos

ApsaraDB for MongoDB:Solución de problemas de alto uso de memoria en ApsaraDB for MongoDB

Última actualización: Sep 03, 2026

El uso de memoria es una métrica crítica para las instancias de ApsaraDB for MongoDB. En este tema aprenderá a consultar el uso de memoria de una instancia de ApsaraDB for MongoDB, identificar las causas más frecuentes y aplicar estrategias de optimización.

Contexto

Cuando se inicia un proceso de ApsaraDB for MongoDB, este carga archivos binarios y bibliotecas del sistema dependientes en la memoria. Además, gestiona la asignación y liberación de memoria para tareas como la administración de conexiones de clientes, el procesamiento de solicitudes y el motor de almacenamiento. De forma predeterminada, ApsaraDB for MongoDB utiliza tcmalloc de Google como su asignador de memoria. La memoria se consume principalmente por el motor de almacenamiento WiredTiger y por las conexiones de clientes y el procesamiento de solicitudes.

Consultar el uso de memoria

  • Analizar los gráficos de monitoreo

    Puede consultar el uso de memoria de ApsaraDB for MongoDB en la página Monitoring Information de la consola de ApsaraDB for MongoDB. La composición de nodos de las instancias de ApsaraDB for MongoDB varía según la arquitectura de la instancia. Seleccione un nodo para consultar su uso de memoria.

    • Arquitectura de conjunto de réplicas: incluye un nodo primario, uno o más nodos secundarios, un nodo oculto y, opcionalmente, uno o más nodos de solo lectura.

    • Arquitectura de clúster fragmentado: el uso de memoria de cada shard es similar al de un conjunto de réplicas. El Config Server almacena los metadatos de configuración. El uso de memoria de un nodo de enrutamiento mongos depende del tamaño de los conjuntos de resultados de agregación, la cantidad de conexiones y el tamaño de los metadatos.

  • Usar la línea de comandos

    Connect to the instance mediante el shell de mongo y ejecute el comando db.serverStatus().mem para consultar y analizar el uso de memoria. El siguiente código muestra un ejemplo de salida:

{ "bits" : 64, "resident" : 13116, "virtual" : 20706, "supported" : true }
// resident indicates the physical memory used by the mongod process, in MB.
// virtual indicates the virtual memory used by the mongod process, in MB.
Nota

Referencia del comando serverStatus.

Causas frecuentes

Memoria del motor

La mayor parte de la memoria en una instancia de ApsaraDB for MongoDB se utiliza para la caché del motor de almacenamiento. Por motivos de compatibilidad y seguridad, ApsaraDB for MongoDB establece el CacheSize de WiredTiger en aproximadamente el 60% de la memoria total asignada a la instancia. Product specifications.

Si el uso de la caché del motor de almacenamiento alcanza el 95% del CacheSize configurado, la instancia experimenta una carga elevada y los hilos que procesan las solicitudes de los usuarios comienzan a desalojar páginas limpias. Si los datos sucios en la caché del motor de almacenamiento superan el 20% del CacheSize, los hilos de usuario también desalojan páginas sucias. Durante este proceso, los usuarios pueden experimentar un bloqueo notable de las solicitudes. Eviction parameter descriptions.

Compruebe el uso de memoria del motor con estos métodos:

  • Consultar el uso de memoria del motor de almacenamiento WiredTiger

    En el shell de mongo, ejecute el comando db.serverStatus().wiredTiger.cache. El campo de salida bytes currently in the cache muestra la cantidad de memoria que utiliza la caché. El siguiente código muestra un ejemplo de salida:

    {
       ......
       "bytes belonging to page images in the cache":6511653424,
       "bytes belonging to the cache overflow table in the cache":65289,
       "bytes currently in the cache":8563140208,
       "bytes dirty in the cache cumulative":NumberLong("369249096605399"),
       ......
    }
  • Consultar la proporción de datos sucios en la caché del motor WiredTiger

Memoria de conexiones y solicitudes

Una cantidad elevada de conexiones consume mucha memoria por las siguientes razones:

  • Overhead de la pila de hilos: cada conexión tiene un hilo de backend correspondiente para procesar sus solicitudes. Cada hilo puede consumir hasta 1 MB de espacio de pila, aunque el uso típico oscila entre decenas y cientos de kilobytes.

  • Búferes del kernel para conexiones TCP: a nivel del kernel, cada conexión TCP tiene búferes de lectura y escritura, determinados por parámetros del kernel TCP como tcp_rmem y tcp_wmem. No es necesario gestionar esta memoria. Sin embargo, una mayor cantidad de conexiones simultáneas y un búfer de socket predeterminado más grande incrementan el consumo de memoria TCP.

  • Gestión de memoria de tcmalloc: cada solicitud asigna búferes temporales para el manejo y la clasificación de paquetes. Una vez completada la operación, estos búferes regresan a la caché interna de tcmalloc en lugar de devolverse inmediatamente al sistema operativo. tcmalloc libera gradualmente la memoria en caché, pero la memoria no liberada puede acumularse hasta alcanzar decenas de gigabytes.

Métodos de investigación:

  • Consultar el uso de conexiones

  • Consultar la cantidad de memoria retenida por tcmalloc

    Ejecute el comando db.serverStatus().tcmalloc para consultar la cantidad de memoria que tcmalloc no ha devuelto al sistema operativo. El tamaño de la caché de tcmalloc se calcula mediante la siguiente fórmula: caché de tcmalloc = pageheap_free_bytes + total_free_byte. El siguiente código muestra un ejemplo de salida:

    {
       ......
       "tcmalloc":{
               "pageheap_free_bytes":NumberLong("3048677376"),
               "pageheap_unmapped_bytes":NumberLong("544994184"),
               "current_total_thread_cache_bytes":95717224,
               "total_free_byte":NumberLong(1318185960),
               ......
       }
    }
    Nota

    Referencia del asignador de memoria tcmalloc.

Memoria de metadatos

Una gran cantidad de bases de datos, colecciones e índices en una instancia de ApsaraDB for MongoDB consume mucha memoria debido a los metadatos asociados. Las versiones anteriores de ApsaraDB for MongoDB pueden presentar los siguientes problemas:

  • En versiones de ApsaraDB for MongoDB anteriores a la 4.0, una copia de seguridad lógica completa puede abrir una gran cantidad de manejadores de archivos. Si estos manejadores no se devuelven al sistema operativo rápidamente, el uso de memoria puede aumentar de forma acelerada.

  • En ApsaraDB for MongoDB 4.0 y versiones anteriores, eliminar una gran cantidad de colecciones puede no quitar correctamente los manejadores de archivos correspondientes, lo que provoca una fuga de memoria.

Memoria de creación de índices

Durante las escrituras normales de datos, un nodo secundario mantiene un búfer de hasta aproximadamente 256 MB para la aplicación del oplog. Sin embargo, replicar operaciones de creación de índices en un nodo secundario puede consumir más memoria.

  • En versiones de ApsaraDB for MongoDB anteriores a la 4.2, la creación de índices admite la opción background. Cuando se especifica {background:true}, el índice se compila en segundo plano. La replicación de esta operación es serial y puede consumir hasta 500 MB de memoria.

  • En ApsaraDB for MongoDB 4.2 y versiones posteriores, la opción background está obsoleta. Los nodos secundarios pueden replicar operaciones de creación de índices en paralelo, lo que consume más memoria. Crear varios índices al mismo tiempo puede provocar un error de falta de memoria (OOM).

Uso de memoria de la caché de planes

En algunos escenarios, una sola consulta puede tener una gran cantidad de planes de ejecución candidatos, lo que provoca que la caché de planes consuma una cantidad significativa de memoria.

Consultar el uso de memoria de la caché de planes: en ApsaraDB for MongoDB 4.0 y versiones posteriores, puede ejecutar el comando db.serverStatus().metrics.query.planCacheTotalSizeEstimateBytes para consultar el uso de memoria.

Nota

Estrategias de optimización

La optimización de memoria busca equilibrar la utilización de recursos y el rendimiento, no minimizar el uso a toda costa.

ApsaraDB for MongoDB especifica el CacheSize, el cual no se puede modificar. Optimice el uso de memoria con estas estrategias:

  • Controle las conexiones simultáneas. El controlador predeterminado de MongoDB establece un pool de 100 conexiones. Si se conectan muchos clientes, reduzca el tamaño del pool por cliente. Mantenga el total de conexiones persistentes por debajo de 1,000 para evitar un overhead excesivo de memoria y cambios de contexto.

  • Reduzca el overhead de memoria por solicitud mediante la creación de índices para evitar escaneos de colecciones y clasificaciones en memoria.

  • Si el uso de memoria permanece alto después de optimizar las consultas y las conexiones, actualice la especificación de memoria de la instancia para prevenir errores OOM y degradación del rendimiento causada por un desalojo excesivo de caché.

  • Acelere la liberación de memoria por parte de tcmalloc. Si el uso de memoria de su instancia de base de datos supera el 80%, puede ajustar los parámetros relacionados con tcmalloc en la página Parameter Settings de la consola.

    1. Habilite el parámetro tcmallocAggressiveMemoryDecommit. Esta configuración resuelve eficazmente los problemas de retención de memoria.

    2. Si el problema persiste, aumente gradualmente el valor de tcmallocReleaseRate (por ejemplo, de 1 a 3 y luego a 5).

    Importante
    • Realice los ajustes durante horas de baja actividad. Estos parámetros pueden degradar el rendimiento de la base de datos. Revierta los cambios inmediatamente si su negocio se ve afectado.

    • Monitoree el uso de CPU, el tiempo de respuesta (RT) y los opCounters antes y después del ajuste para evaluar el impacto.

  • Optimice la cantidad de bases de datos y colecciones eliminando colecciones e índices innecesarios, consolidando tablas, dividiendo la instancia o migrando a un clúster fragmentado. Instance performance slows down or becomes abnormal due to an excessive number of databases and tables.

Nota

Si encuentra otros escenarios que puedan involucrar a ApsaraDB for MongoDB mientras utiliza ApsaraDB for MongoDB, póngase en contacto con el soporte técnico de Alibaba Cloud.

Referencias

Parámetros de desalojo

Parámetro

Valor predeterminado

Descripción

eviction_target

80%

Cuando el uso de la caché supera el eviction_target, los hilos de desalojo en segundo plano comienzan a desalojar páginas limpias.

eviction_trigger

95%

Cuando el uso de la caché supera el eviction_trigger, los hilos de usuario también comienzan a desalojar páginas limpias.

eviction_dirty_target

5%

Cuando la proporción de caché sucia supera el eviction_dirty_target, los hilos de desalojo en segundo plano comienzan a desalojar páginas sucias.

eviction_dirty_trigger

20%

Cuando la proporción de caché sucia supera el eviction_dirty_trigger, los hilos de usuario también comienzan a desalojar páginas sucias.

eviction_updates_target

2.5%

Cuando la proporción de actualizaciones de la caché supera el eviction_updates_target, los hilos de desalojo en segundo plano comienzan a desalojar fragmentos de memoria relacionados con objetos pequeños.

eviction_updates_trigger

10%

Cuando la proporción de actualizaciones de la caché supera el eviction_updates_trigger, los hilos de usuario también comienzan a desalojar fragmentos de memoria relacionados con objetos pequeños.

Preguntas frecuentes

P: ¿Cómo aumento el límite de memoria para operaciones de agregación en MongoDB?

R: ApsaraDB for MongoDB no permite aumentar directamente el límite de memoria para operaciones de agregación. Cada etapa en un pipeline de agregación de MongoDB tiene un límite de memoria de 100 MB. Si una etapa supera este límite, el sistema devuelve un error. Puede resolver este problema especificando explícitamente la opción {allowDiskUse:true} en su pipeline de agregación. MongoDB 6.0 y versiones posteriores admiten el parámetro global predeterminado allowDiskUseByDefault. Cuando una operación de agregación requiere demasiada memoria, MongoDB utiliza automáticamente espacio temporal en disco para evitar un alto consumo de memoria. Para otras estrategias destinadas a reducir el uso de memoria, consulte Optimization strategies.