sql >> Base de Datos >  >> NoSQL >> MongoDB

Corrección de fallas de página en MongoDB

Las fallas de página son un error frecuente que ocurre principalmente en una aplicación grande que involucra grandes datos. Tiene lugar cuando la base de datos MongoDB lee datos de la memoria física en lugar de la memoria virtual. Los errores de falla de página ocurren en el momento en que MongoDB quiere obtener datos que no están disponibles en la memoria activa de la base de datos, por lo tanto, se ven obligados a leer desde el disco. Esto crea una gran latencia para las operaciones de rendimiento, lo que hace que las consultas parezcan retrasadas.

Ajustar el rendimiento de MongoDB mediante el ajuste es un componente vital que optimiza la ejecución de una aplicación. Las bases de datos están mejoradas para trabajar con la información guardada en el disco, sin embargo, habitualmente almacenan en caché grandes cantidades de datos en la RAM en un intento de acceder al disco. Es costoso almacenar y acceder a los datos de la base de datos, por lo tanto, la información debe almacenarse primero en el disco antes de permitir que las aplicaciones accedan a ella. Debido al hecho de que los discos son más lentos en comparación con la caché de datos RAM, el proceso consume una cantidad significativa de tiempo. Por lo tanto, MongoDB está diseñado para informar la ocurrencia de fallas de página como un resumen de todos los incidentes en un segundo

La topología de movimiento de datos en MongoDB

Los datos del cliente se mueven a la memoria virtual donde la memoria caché de la página los lee a medida que se escriben, luego los datos se almacenan en el disco como se muestra en el siguiente diagrama.

Cómo encontrar fallas en la página de MongoDB

Las fallas de página se pueden detectar mediante el rendimiento de bloqueo que garantiza la consistencia de los datos en MongoDB. Cuando una operación determinada se pone en cola o se ejecuta durante mucho tiempo, el rendimiento de MongoDB se degrada y la operación se ralentiza mientras espera el bloqueo. Esto provoca una ralentización, ya que los retrasos relacionados con el bloqueo son esporádicos y, en ocasiones, afectan al rendimiento de la aplicación. El bloqueo influye en el rendimiento de una aplicación cuando los bloqueos se dividen (locks.timeAcquiringMicros por locks.acquireWaitCount), lo que da el tiempo promedio de espera para un modo de bloqueo determinado. Locks.deadLockCount proporciona el total de todas las adquisiciones de bloqueos experimentadas. Dado que globalLock.totalTime es armoniosamente alto, hay numerosas solicitudes que esperan un bloqueo. A medida que más solicitudes esperan para el bloqueo, se consume más RAM y esto conduce a fallas de página.

También puede usar mem.mapped que permite a los desarrolladores examinar la memoria total que está utilizando mongod. Mem.mapped es un operador de servidor para verificar la cantidad de memoria en megabytes (MB) en un motor de almacenamiento MMAPv1. Si el operador mem.mapped muestra un valor A mayor que la cantidad total de memoria del sistema, se producirá un error de página porque una cantidad tan grande de uso de memoria provocará un error de página en la base de datos.

Cómo ocurren las fallas de página en MongoDB

La carga de páginas en MongoDB depende de la disponibilidad de memoria libre, en caso de que carezca de memoria libre, el sistema operativo debe:

  1. Busque una página que la base de datos haya dejado de usar y escríbala en el disco de memoria.
  2. Cargue la página solicitada en la memoria después de leerla desde el disco.

Estas dos actividades tienen lugar cuando las páginas se están cargando y, por lo tanto, consumen mucho  tiempo en comparación con la lectura en una memoria activa, lo que provoca fallas en la página.

Resolviendo fallas de página de MongoDB

Las siguientes son algunas formas a través de las cuales se pueden resolver fallas de página: 

  1. Escalar verticalmente a dispositivos con suficiente RAM o escalar horizontalmente: cuando no hay suficiente RAM para un conjunto de datos determinado, el enfoque correcto es aumentar la memoria RAM escalando verticalmente a dispositivos con más RAM para agregar más recursos al servidor. El escalado vertical es una de las mejores y más sencillas formas de aumentar el rendimiento de MongoDB al no distribuir la carga entre varios servidores. Dado que escalar verticalmente agrega más RAM, escalar horizontalmente permite agregar más fragmentos a un clúster fragmentado. En términos simples, la escala horizontal es donde la base de datos se divide en varios fragmentos y se almacena en varios servidores. El escalado horizontal permite al desarrollador agregar más servidores sobre la marcha y esto aumenta en gran medida el rendimiento de la base de datos, ya que no incurre en un tiempo de inactividad cero. El escalado vertical y el escalado horizontal reducen la ocurrencia de fallas de página al aumentar la memoria en la que uno trabaja mientras trabaja con la base de datos.
  2. Indice de datos correctamente: uso de índices apropiados para garantizar que haya consultas eficientes que no provoquen análisis de la colección. La indexación adecuada garantiza que la base de datos no itera sobre cada documento de una colección y, por lo tanto, resuelve la posible aparición de un error de falla de página. El análisis de la colección provoca un error de falla de página porque el motor de consulta inspecciona toda la colección a medida que se lee en la RAM. La mayoría de los documentos en el escaneo de la colección no se devuelven en la aplicación y, por lo tanto, provoca fallas de página innecesarias para cada consulta posterior que no es fácil de evadir. Además, el exceso de índices también puede conducir a un uso ineficiente de la RAM, lo que puede provocar un error de falla de página. Por lo tanto, la indexación adecuada es fundamental si un desarrollador tiene la intención de resolver errores de fallas de página. MongoDB ofrece asistencia para determinar los índices que se deben implementar al usar la base de datos. Ofrecen Slow Query Analyzer que brinda la información necesaria sobre cómo indexar para usuarios y usuarios compartidos.
  3. Migrar a la última versión de MongoDB y luego mover la aplicación a WiredTiger. Esto es necesario si tiene la intención de evitar experimentar un error de falla de página, ya que las fallas de página solo son comunes en los motores de almacenamiento MMAPv1 a diferencia de las versiones más nuevas y WiredTiger. El motor de almacenamiento MMAPv1 ha quedado obsoleto y MongoDB ya no lo admite. WiredTiger es el motor de almacenamiento predeterminado actual en MongoDB y tiene control de concurrencia multiversión, lo que lo hace mucho mejor en comparación con el motor de almacenamiento MMAPv1. Con WiredTiger, MongoDB puede usar tanto el caché del sistema de archivos como el caché interno de WiredTiger, que tiene un tamaño muy grande de 1 GB (50% 0f (RAM - 1 GB)) o 256 MB.
  4. Haga un seguimiento de la memoria RAM total disponible para usar en su sistema. Esto se puede hacer mediante el uso de servicios como el monitoreo de New Relic, Google Cloud Monitoring. Además, BindPlane se puede utilizar con los servicios de monitoreo en la nube mencionados. El uso de un sistema de monitoreo es una medida proactiva que permite contrarrestar las fallas de página antes de que sucedan en lugar de reaccionar ante las fallas de página que ocurren. BindPlane permite que el monitor configure alertas constantes para la ocurrencia de fallas de página, las alertas también informan sobre la cantidad de índices, el tamaño del índice y el tamaño del archivo.
  5. Asegurarse de que los datos estén configurados en el conjunto de trabajo prevaleciente y que no utilicen más RAM de la recomendada. MongoDB es un sistema de base de datos que funciona mejor cuando los datos e índices a los que se accede con frecuencia pueden caber perfectamente en la memoria asignada. El tamaño de la memoria RAM es un aspecto vital cuando se optimiza el rendimiento de la base de datos, por lo tanto, debe asegurarse de que siempre haya suficiente memoria RAM antes de implementar la aplicación.
  6. Distribuir la carga entre instancias de mongod agregando fragmentos o implementando un clúster fragmentado. Es de vital importancia habilitar el sombreado donde se encuentra la colección de destino. Primero, conéctese a mongos en el shell de mongo y use el método a continuación.
    1. sh.shardCollection()

      Luego crea un índice por este método.

      ​db.collection.createIndex(keys, options)
      El índice creado admite la clave de fragmento, es decir, si la colección creada ya había recibido o almacenado algunos datos. Sin embargo, si la colección no tiene datos (vacía), utilice el siguiente método para indexarla como parte de ssh.shardCollection: sh.shardCollection()
    2. Esto es seguido por cualquiera de las dos estrategias proporcionadas por mongoDB.
      1. Sombreado hash 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Sombreado basado en rango 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Cómo prevenir fallas en la página de MongoDB

  1. Agregue fragmentos o implemente un clúster fragmentado para distribuir la carga
  2. Tenga suficiente RAM para su aplicación antes de implementarla
  3. Pase a las versiones más nuevas de MongoDB y luego continúe con WiredTiger
  4. Escala vertical u horizontalmente para un dispositivo con más RAM 
  5. Utilice la RAM recomendada y realice un seguimiento del espacio RAM utilizado

Conclusión 

Unos pocos errores de página (solos) toman poco tiempo; sin embargo, en una situación en la que hay numerosos errores de página (agregados), es una indicación de que la base de datos está leyendo una gran cantidad de datos en el disco. Cuando ocurra un agregado, habrá más bloqueos de lectura de MongoBD que conducirán a una falla de página.

Al usar MongoDB, el tamaño de la RAM del sistema y la cantidad de consultas pueden influir en gran medida en el rendimiento de la aplicación. El rendimiento de una aplicación en MongoDB depende en gran medida de la RAM disponible en la memoria física, lo que afecta el tiempo que tarda la aplicación en realizar una sola consulta. Con suficiente RAM, se reduce la ocurrencia de errores de página y se mejora el rendimiento de la aplicación.