2010-06-11 3 views
6

überschreiten Verzeihung, wenn dies mehr Serverfault vs Stackoverflow ist. Es scheint an der Grenze zu sein.Wie kann ich die 60% Speicherlimit von IIS7 in ASP.NET Caching-Anwendung

Wir haben eine Anwendung, die eine große Menge an Produktdaten für eine E-Commerce-Anwendung mit ASP.NET-Caching zwischenspeichert. Dies ist ein Dictionary-Objekt mit 65K-Elementen, und unsere Berechnungen legen die Größe des Objekts auf ~ 10 GB fest.
Problem:

  1. Die Größe des Speichers scheint das Objekt verbraucht über unsere 10GB Berechnung weit zu sein.

  2. GRÖSSTE CONCERN: Wir können nicht scheinen über 60% der 32 GB im Server zu verwenden.

Was wir bisher versucht:

In machine.config/system.web (sf erlaubt nicht die Tags, verzeihen Sie die Formatierung):

processModel autoConfig="true" memoryLimit="80" 

in web.config/system.web/Caching/Cache (sf erlaubt nicht die Tags, die Formatierung verzeihen):

privateBytesLimit = "20000000000" (and 0, the default of course) 
percentagePhysicalMemoryUsedLimit = "90" 

Umwelt: Windows-2008R2 x64 32GB RAM IIS7

Nichts scheint uns den 60% Wert überschreiten zu können. Siehe Screenshot von taskman.

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

+0

Eine fundierte Vermutung: Der Server passt seinen Arbeitsspeicher neu an, um ihn an die erhöhte Arbeitslast anzupassen, indem er mehr Auslagerungsdatei verwendet, um Speicherausfälle auszugleichen, oder Speicher schneller entsorgt. So ähnlich. Wie sieht die Registerkarte "Leistung" in Taskman aus, wenn Sie die Last erhöhen? Erhöht sich die Größe der Auslagerungsdatei? –

+0

@Robert: Swap bleibt ziemlich flach (was sinnvoll ist, da es sich um einen In-Memory-Cache handelt). Aber es lohnt sich zu überprüfen. @all: Ich frage mich, ob die schiere Größe eines einzelnen Objekts das Problem ist. Benötigt der GC einen gewissen "Spielraum" zum Verschieben von Objekten und dieses _ein_ Objekt hat das überschritten? – evilknot

+0

Tauschen Sie Objekte in und aus dem Wörterbuch aus? Wenn Sie das tun, könnte das Druck auf den GC ausüben, da jeder Tausch ein Objekt freigibt, das irgendwann entsorgt werden muss. Der GC wartet möglicherweise nicht darauf, dass Ihnen nicht genügend Arbeitsspeicher zur Verfügung steht, bevor eine Sammlung durchgeführt wird. Einige Speicherprofile könnten in Ordnung sein. –

Antwort

1

Haben Sie eine andere Caching-Strategie in Betracht gezogen? Das integrierte Caching ist nicht nur reich an Funktionen, und Sie werden sich schwer tun, es noch mehr zu tun (es sei denn, ein IIS-Guru hat etwas clevere Arbeit).

Wir verbrachten viel Zeit damit und gaben auf. Wir verwenden tatsächlich schlankere Objekte, um sie im Cache zu speichern und die volleren Objekte nach Bedarf zu erhalten.

Wenn wir darüber nachdenken mussten, haben wir Memcached und Velocity untersucht, aber wir haben uns davon zurückgezogen, sie noch nicht zu implementieren. Sie sind jedoch mehr funktionsreich.

Wie speichern Sie die Elemente im Cache über Code? Setzen Sie sie beim Anwendungsstart oder nach der ersten Anfrage für jeden ein? Der Grund, warum ich frage, ist, ob Ihre Cache-Schlüssel effektiv sind und Sie tatsächlich den Cache immer wieder auffüllen und nichts abrufen (dies kann bei nur einem Objekttyp der Fall sein). Wir haben es geschafft, dies einmal zu tun, indem wir beispielsweise die Uhrzeit an einen datumsspezifischen Cache-Schlüssel anhängen.

+0

Wir erforschen auf jeden Fall andere Caches. Wir füllen den Cache nur einmal, wenn die Anwendung gestartet wird, und es ändert sich nicht. Wir haben das oben genannte zusätzlich zu nCache betrachtet. Vielen Dank! – evilknot

+1

+1, asp.net Cache ist wirklich falsch hier - Sie wollen wahrscheinlich etwas anderes und aus dem Prozess. –

2

Ein bisschen spät, aber ich habe fast das gleiche Problem. Das Problem mit der Einstellung memoryLimit auf processModel ist, dass es scheinbar keine Auswirkungen hat, obwohl es als solches dokumentiert ist.

percentagePhysicalMemoryUsedLimit sieht ähnlich aus wie es sollte etwas tun, hat aber keine Wirkung.

privateBytesLimit="20000000000"funktioniert Arbeit obwohl. Ich ging und debuggte den Prozess und fand das CacheMemorySizePressure-Objekt, und es nahm den Wert erfolgreich ab und legte es auf _memoryLimit fest. Ich würde das überprüfen.

Eine andere Option ist das Festlegen eines Schwellenwerts für die Wiederverwendung des privaten Arbeitsspeichers im IIS-Anwendungspool. Das sollte auch aufgehoben werden und die Standardgrenze von 60% überschreiben.

Eine dritte Option ist die Verwendung der neuen MemoryCache Klasse und das Setzen der PhysicalMemoryLimit darauf.

Verwandte Themen