2012-01-20 3 views
6

¿Cuántos datos son demasiados para el caché en el montón como ehcache?¿Cuántos datos son demasiado para el caché de Java en el montón? ¿Cuándo debería comenzar a pensar en el caché de almacenamiento dinámico?

Tengo un servidor RAM de 24 GB. Probablemente comenzaré dedicando de 2 a 4 GB para el almacenamiento en caché, pero podría terminar dedicando 20 GB más o menos a la caché. ¿En qué punto debería preocuparme que el GC para el caché en el montón lleve demasiado tiempo?

Por cierto, ¿DirectMemory es el único caché de almacenamiento abierto de almacenamiento dinámico disponible? ¿Está listo para el horario de máxima audiencia?

+0

La respuesta a su pregunta depende más de las características de uso de la memoria caché que del tamaño de la memoria caché. Por ejemplo, relación de lectura/escritura, TTL, tamaño de los objetos que está almacenando, cantidad de objetos que podría almacenar. Además, tu pregunta es hacer una pregunta bastante difusa. ¿Qué considerarías "demasiado tiempo"? o "¿Listo para el horario de máxima audiencia?" Debe saber qué tipo de SLA necesita antes de poder evaluar realmente cualquier solución de almacenamiento en caché. Tiempo máximo de respuesta en ms, y porcentaje de aciertos de SLA. – allingeek

Respuesta

3

Depende de su JVM y especialmente del GC utilizado. Los GC más antiguos, especialmente, no eran realmente capaces de manejar montones realmente grandes, pero ha habido un esfuerzo creciente para solucionarlo.

Los sistemas Azul, por ejemplo, venden hardware con cientos de GB de pila sin problemas (es decir, pausas gc en ms no medio minutos) gracias a su special GC, por lo que no es una limitación de Java per se. Sin embargo, no tengo idea de qué tan buenos puntos de acceso/IBM tiene a través del tiempo. Pero entonces un montón de 24gb no es tan grande de todos modos, G1 probablemente debería hacer un buen trabajo allí de todos modos.

2

¿En qué punto debería preocuparme que GC para el caché en el montón lleve demasiado tiempo?

¿Cuánto tiempo es demasiado largo?

En serio, si está ejecutando un recolector de basura de "rendimiento" y esto le está dando pausas que son demasiado largas, entonces debería intentar cambiar a un colector de pausa baja; p.ej. CMS o G1.

2

El problema principal con una memoria caché grande es el tiempo total de la GC. Para hacerte una idea, podría ser de 1 segundo por GB (Esto varía de una aplicación a otra). Si tienes un caché de 20 GB y tu aplicación hace una pausa de 20 segundos cada cierto tiempo ¿es aceptable?

Como fanático de los archivos directos y de los mapas de memoria, tiendo a pensar en términos de cuándo los dos no pondría los datos en un montón, y simplemente usaría el montón para simplificar. ;) Los archivos mapeados en memoria no tienen impacto en el tiempo total del GC, independientemente del tamaño.

Una de las ventajas de utilizar un archivo mapeado de memoria es que puede ser mucho más grande que su memoria física y aun así funcionar razonablemente bien. Esto deja el sistema operativo para determinar qué partes deben estar en la memoria y qué debe enjuagarse en el disco.

BTW: Tener un SSD más rápido también ayuda;) Las unidades más grandes también tienden a ser más rápidas también. Verifique los IOP que pueden realizar.

En este ejemplo, creo una memoria de 8 TB mapeada en una máquina con 16 GB. http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

Tenga en cuenta que funciona mejor en el ejemplo de archivo de 80 GB, es probable que 8 TB sea excesivo. ;)

Cuestiones relacionadas