2010-05-16 19 views
16

Gibt es eine Art von Sitzungsgröße Einschränkung oder ratsam Wert nicht zu übertreffen?ASP.NET Begrenzung der Sitzungsgröße

In meiner Webanwendung erstelle ich einige DataTables, um Benutzerauswahlen zu speichern, die in der Sitzung gespeichert werden, bis der Benutzer Auswahlen genehmigt, so dass ich diese Werte zur Datenbank hinzufüge.

Das Problem ist, dass ich nicht weiß, ob die Sitzung zuverlässig genug ist, um wenige Objekte zu halten oder nicht?

Danke!

weitere Informationen

Session Größe etwa 10-20KB max.

+2

In-proc oder out of proc? – Liam

Antwort

7

Ja, es ist zuverlässig genug. Es ist einfach nicht sehr skalierbar, also planen Sie voraus. Dies wird völlig zum Erliegen kommen, wenn Sie es auf mehr als einem Server ausführen. in der Regel akzeptabel ist (obwohl hohe Anzahl-of-Concurrent-User * SizeOf-Session < Available-Mem

Es ist natürlich von der Größe der Tabellen hängt, um nur einige kB Speicherung:
Und es ist eine Art von Grenze Verkehrsflächen werden versuchen, es kleiner zu halten).

Wenn Ihre Benutzer Tabellen gemeinsam nutzen können, können Sie diese Daten im Anwendungsobjekt speichern, was eine große Einsparung darstellt.

Und ein Session-Objekt ist auf die TimeOut-Einstellung beschränkt, Standard ist 20 min. Eine Möglichkeit, den Speicherverbrauch zu optimieren, besteht darin, dies zu reduzieren, aber das ist ein Kompromiss mit der Benutzerfreundlichkeit.

+1

danke, also keine speziellen Größenbeschränkungen? Ich muss dort einige Kbs pro Benutzer speichern. Wenige kleine Tabellen und so ... Sitzung ist aus Proc und Timeout ist ziemlich groß. Die Daten werden gespeichert, bis der Benutzer das Formular beendet. – eugeneK

+0

Ich dachte, stattdessen ViewState zu verwenden, aber der Anzeigezustand ist bereits groß genug, so dass zumindest einige Daten vom Server und einige von den Seitendaten kommen. – eugeneK

+8

Eine offensichtliche Grenze für 32-Bit-Anwendungspools liegt bei 1,3 GB Gesamtspeicherauslastung. Sie sollten sicherstellen, dass Ihre Sitzungen nicht zu viel davon verbrauchen. –

1

Sie sollten immer davon ausgehen, Sitzung ist ein sehr wertvoller Speicher und sehr begrenzt. Der Verbrauch sollte so gering wie möglich sein, da Sie nie wissen können, wie viele Benutzer die Anwendung unterstützen wird.

DataTable kann zu groß sein, um in Sitzungen gespeichert zu werden, es sei denn, es kann klein genug gehalten werden.

+2

danke, aber ich weiß, dass Ich brauche Größe, zumindest einige Grundregeln. Nicht nur so klein wie möglich. – eugeneK

2

Ich gehe davon aus, dass Sie die Sitzung im Modus "inProc" gespeichert haben. In diesem Modus werden die Sitzung, der Cache usw. von ASP.NET-Anwendungen im RAM des Webservers gespeichert (über den Prozess aspnet_wp.exe). Und .NET kann nicht alles nutzen. Es gibt eine Einstellung in machine.config, die den Grenzwert angibt (standardmäßig 60%). Sobald dieser Schwellenwert erreicht ist, wird der Arbeitsprozess von IIS wiederverwendet, und alle Sitzungsinformationen gehen verloren.

Beachten Sie, dass, wenn Ihr Server mehrere asp.net-Anwendungen hostet, die 60% des Speichers von allen Apps gemeinsam genutzt werden sollen. Wenn also die kumulative Speicherbelegung den Schwellenwert erreicht, wird der Worker-Prozess weiterhin recycelt.

Alternativ dazu können Sie die Anwendung so optimieren, dass die Sitzung sparsam verwendet wird, indem Sie die Anwendung so einrichten, dass die Sitzung im Modus "out of process" verwendet wird (mit einem Statusserver oder sqlserver zum Speichern von Sitzungsinformationen).

Der Out-of-Process-Modus kann die Systemleistung beeinträchtigen.

Weitere Informationen zum Sitzungsstatus-Management finden Sie im Artikel this.

10

Hier ein paar Notizen über Sitzungsstatus:

  • InProc (mode="InProc") Sitzungsstatus wird auf die Größe des verfügbaren Speichers auf dem Arbeitsprozess beschränkt. Es werden nur Objektverweise gespeichert, nicht die Objekte selbst.

Aus Prozesszustand Management serialisiert Objekte vor ihnen persistierenden:

  • Out of Process Statusverwaltung den Sitzungsstatus-Server (mode="StateServer") auf die Menge an Speicher in den Staatsdienst verfügbar ist begrenzt.

  • Die Out-of-Process-Statusverwaltung mit SQL Server (mode="SQLServer") ist nur durch die maximale Größe des SQL-Datentyps image oder die maximal zulässige Größe der Datenbank gebunden.

Offensichtlich gibt noch genug Speicher zur Verfügung zu dem Arbeitsprozess sein, um einen aus Session-Objekt zurück in dem Speicher und Wieder Hydrat für die Dauer der HTTP-Anforderung zu ziehen.

Wie ich bereits erwähnt, aus Prozess Zustandsverwaltung serialises Objekte vor ihnen persistierenden. Diese

bedeutet, dass Objekte serialisable werden müssen, die schließt zum Beispiel XmlDocument oder irgendetwas, das von MarshalByRef erbt.

Des Versuch, Objekte dieser Art serialise in folgenden Ausnahme führen:

Kann den Sitzungsstatus serialisieren. In 'StateServer' und 'SQLServer' Modus wird ASP.NET die Sitzungsstatusobjekte, , serialisieren, und als Ergebnis sind nicht serialisierbare Objekte oder MarshalByRef-Objekte nicht zulässig. Die gleiche Einschränkung gilt, wenn eine ähnliche Serialisierung vom benutzerdefinierten Sitzungszustandsspeicher im Modus 'Benutzerdefiniert' ausgeführt wird.

+2

Wie beantwortet das die Frage? – Liam

+1

Was ist * begrenzt auf die Menge an Speicher für den Staatsdienst * soll bedeuten? – Liam

+0

@Liam - OP hat die Sitzungszustandsverwaltung offenbar nicht gelesen. Ich erkläre die verfügbaren Optionen, ist das so eine schlechte Sache, erweitern OP Wissen mit relevanten gleichen Themen Informationen? Pro Sekunde Frage. Der Statusdienst ist ein Out-of-Process-Dienst, der Sitzungsstatus wird im Speicher beibehalten (nicht auf der Festplatte oder in einer SQL-Datenbank). Daher wird er durch den verfügbaren Speicher begrenzt. Dies ist wichtig, wenn Sie dies tun Ausführen eines 32-Bit-Zustandsdiensts auf einer Maschine mit möglicherweise anderem Speicherdruck. – Kev