Perdón si esto es más incumplimiento del servidor frente a stackoverflow. Parece estar en la frontera.¿Cómo puedo exceder el límite de memoria del 60% de IIS7 en la aplicación de almacenamiento en caché de ASP.NET
Tenemos una aplicación que almacena en caché una gran cantidad de datos de productos para una aplicación de comercio electrónico que utiliza el almacenamiento en caché de ASP.NET. Este es un objeto de diccionario con 65K elementos, y nuestros cálculos ponen el tamaño del objeto en ~ 10GB.
Problema:
La cantidad de memoria consume el objeto parece estar muy por encima de nuestro cálculo de 10 GB.
PREOCUPACIÓN MÁS GRANDE: Parece que no podemos usar más del 60% de los 32 GB en el servidor.
Lo que hemos tratado hasta ahora:
En machine.config/system.web (sf no permite que las etiquetas, perdón por el formato):
processModel autoConfig="true" memoryLimit="80"
En web.config/system.web/caching/cache (sf no permite las etiquetas, perdone el formateo):
privateBytesLimit = "20000000000" (and 0, the default of course)
percentagePhysicalMemoryUsedLimit = "90"
Medio Ambiente: de Windows 2008R2 64 32 GB de RAM IIS7
Nada parece que nos permita superar el valor 60%. Ver captura de pantalla de taskman.
http://www.freeimagehosting.net/image.php?7a42144e03.jpg
Una suposición educada: el servidor está reajustando su memoria para ajustarse a la mayor carga de trabajo que está lanzando, usando más del archivo de intercambio para compensar, o basura acumulando memoria más rápido. Algo como eso. ¿Cómo se ve la pestaña Rendimiento en Taskman a medida que aumenta la carga? ¿El tamaño del archivo de intercambio aumenta? –
@Robert: el intercambio se mantiene prácticamente plano (lo cual tiene sentido, ya que es un caché en memoria). Vale la pena comprobarlo. @todos: Me pregunto si el tamaño de un solo objeto es el problema. ¿El GC requiere una cierta cantidad de "espacio de holgura" para desplazar objetos alrededor y este _un_objeto excedió eso? – evilknot
¿Está intercambiando objetos dentro y fuera del diccionario? Si lo está, eso podría estar presionando al GC, ya que cada intercambio liberará un objeto que debe eliminarse en algún momento. Es posible que el GC no espere a que se quede sin memoria antes de realizar una recopilación. Algunos perfiles de memoria pueden estar en orden. –