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().mempara 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.
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 salidabytes currently in the cachemuestra 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
La página Real-Time Monitoring Data en la consola de Database Autonomy Service (DAS) muestra la proporción de datos sucios en la caché del motor WiredTiger en tiempo real.
Utilice la herramienta mongostat incluida con ApsaraDB for MongoDB para consultar la proporción actual de datos sucios en la caché del motor WiredTiger. mongostat.
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
En la página Monitoring Information de la consola de ApsaraDB for MongoDB, consulte el uso de conexiones de su instancia de ApsaraDB for MongoDB.
En el shell de mongo, query the number of connections.
-
Consultar la cantidad de memoria retenida por tcmalloc
Ejecute el comando
db.serverStatus().tcmallocpara 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), ...... } }NotaReferencia 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
backgroundestá 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).
Documentación de MongoDB: Impacto de la compilación de índices en el rendimiento de la base de datos y Proceso de compilación de índices.
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.
Si su instancia ejecuta ApsaraDB for MongoDB 4.0 pero el comando no devuelve el campo planCacheTotalSizeEstimateBytes, la versión menor de su instancia es demasiado antigua. Se recomienda que upgrade the minor version de su instancia.
Relacionado: Secondary node memory arise while balancer doing work.
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.
Habilite el parámetro tcmallocAggressiveMemoryDecommit. Esta configuración resuelve eficazmente los problemas de retención de memoria.
Si el problema persiste, aumente gradualmente el valor de tcmallocReleaseRate (por ejemplo, de 1 a 3 y luego a 5).
ImportanteRealice 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.
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.