2010-12-06 20 views
18

Estoy usando mongo para almacenar archivos de registro. Tanto mongoDB como mysql se ejecutan en la misma máquina, la virtualización de mongo env no es una opción. Me temo que pronto me encontraré con problemas de rendimiento ya que la tabla de registros crece muy rápido. ¿Hay alguna manera de limitar la memoria residente para mongo para que no consuma toda la memoria disponible y ralentice excesivamente el servidor mysql?MongoDB limit memory

máquina DB: 'Lenny' Debian 5

Otras soluciones (por favor comente):

  • Como necesitamos todos los datos históricos, no podemos usar colecciones tapados, pero también estoy considerando usar una secuencia de comandos cron que vuelca y elimina datos antiguos

  • ¿Debo considerar también el uso de claves más pequeñas, como se sugiere en otros foros?

Respuesta

13

Hola, Vlad, tienes un par de estrategias simples aquí con respecto a los registros.

Lo primero que debe saber es que Mongo generalmente puede manejar muchas inserciones sucesivas sin mucha RAM. La razón de esto es simple, solo insertas o actualizas cosas recientes. Por lo tanto, el tamaño del índice crece, pero los datos serán paginados constantemente.

Dicho de otra manera, puede dividir el uso de RAM en dos partes principales: índice & de datos.

Si está ejecutando el registro típico, la porción de datos se vacía constantemente, por lo que solo el índice permanece realmente en la RAM.

Lo segundo que debe saber es que puede mitigar el problema del índice colocando los registros en grupos más pequeños. Piénsalo de esta manera. Si reúne todos los registros en una colección con la fecha (llámelo logs20101206), también puede controlar el tamaño del índice en la RAM.

A medida que transcurren los días, el índice anterior se vacía de la RAM y no se volverá a acceder, por lo que simplemente desaparecerá.

pero también estoy pensando en utilizar un script cron que vuelca y borra los datos antiguos

Este método de registro por día también ayuda a borrar los datos antiguos. En tres meses, cuando haya terminado con los datos, simplemente haga db.logs20101206.drop() y la colección desaparecerá instantáneamente. Tenga en cuenta que no recupera espacio en disco (todo está preasignado), pero los nuevos datos llenarán el espacio vacío.

¿Debo considerar también el uso de teclas más pequeñas, como se sugiere en otros foros?

Sí.

De hecho, lo tengo integrado en mis objetos de datos. Así que accedo a los datos usando logs.action o logs->action, pero debajo, los datos se guardan realmente en logs.a. Es realmente fácil gastar más espacio en "campos" que en "valores", por lo que vale la pena reducir los "campos" y tratar de abstraerlo en otro lugar.

+0

Gracias por su minuciosa respuesta :) –

+0

Sin embargo, ¿no hay alguna forma de especificar al sistema operativo que la memoria residente para mongo no debe ser mayor que XXX MB? –

+0

Probablemente, pero no será una respuesta genérica. Probablemente incluso variará entre las versiones de Linux y su kilometraje definitivamente variará. La solución más sencilla es simplemente construir el sistema para que siga funcionando en condiciones de poca memoria. Estamos ejecutando un sistema de registro similar en producción y está haciendo varios millones de escrituras por día en aproximadamente 1 GB de RAM. (RAM compartida y CPU con otros procesos, pero tiene su propio disco) –

0

Para Windows parece posible controlar la cantidad de memoria que utiliza MongoDB, ver este tutorial en capitán Codeman:

Limit MongoDB memory use on Windows without Virtualization

+0

Esto funciona, pero tiene un límite de 2 GB. p.ej. no puede especificar que desea limitar la memoria mongo a 4 GB. – Ron

+0

@Ron No es cierto. La versión de 32 bits de MongoDB tiene una limitación de tamaño de proceso de 2 GB (al igual que cualquier otro proceso en la versión de 32 bits de Windows). Puede especificar un límite de 4 GB, pero necesitará una máquina de 64 bits, Windows de 64 bits y la versión de 64 bits de Mongo. – Curt

+0

@Curt, tenía 64 bits y tuve problemas con Mongo al usar más memoria que 2GB, por lo que no es un problema de 32 bits. Desde el enlace que di más arriba, el Capitán Codeman dice en su blog que existe una limitación de la virtualización de Windows que solo puede limitar 2GB y dio un enlace a Microsoft Connect (que estableció el problema), aunque ahora el enlace no es válido. Desde mi experiencia esto es lo que vi también. p.ej. Estableció el límite a 2 GB funcionó, estableció el límite a 2.1 GB y la memoria creció a 12 GB. – Ron

1

Para la versión 3.2 y posteriores, que utiliza el motor wiredTiger, la opción es relevante para --wiredTigerCacheSizeGB la pregunta. Puedes configurarlo si sabes lo que estás haciendo exactamente. No sé si es una buena práctica, solo lea desde el document y críelo aquí.