Ich habe drei ASP.NET-Kernanwendungen, die ich ausführen muss. Ich richte zwei Windows Server 2008 R2-Server mit gespiegelten IIS 7.5-Konfigurationen ein und anschließend einen Lastenausgleich, um den Datenverkehr und einen anderen Server zum Statusserver zu leiten. Das ist alles Einrichten und Arbeiten (noch nicht in Produktion).Reduzieren des Speicheraufwands im IIS-Setup mit freigegebenen ASP.NET-Anwendungen
Wir haben etwa 120 Clients (und wächst) und mein Setup ist jetzt, dass jeder Client ihr eigenes virtuelles Verzeichnis (als eine .NET-Anwendung) vom IIS-Root bekommt. Die virtuelle Verzeichnisanwendung verweist auf ein Verzeichnis auf der Festplatte, in dem die eigene Datei web.config gespeichert ist, um beispielsweise Verbindungszeichenfolgen und einige wichtige Anwendungsparameter zu speichern. Dann gibt es für jede Clientanwendung eine virtuelle Verzeichnisanwendung für jede der drei ASP.NET-Kernanwendungen. So etwas wie das:
/ (IIS root)
/client1 => c:\inetpub\clients\client1
/app1 => c:\inetpub\applications\app1\current
/app2 => c:\inetpub\applications\app2\current
/app3 => c:\inetpub\applications\app3\current
/client2 => c:\inetpub\clients\client2
/app1 => c:\inetpub\applications\app1\current
/app2 => c:\inetpub\applications\app2\current
/app3 => c:\inetpub\applications\app3\current
Das 'aktuelle' Verzeichnis ist ein Symlink zur aktuellen Version verwendet wird.
Dieses Setup hat einige Vorteile
- Automatische Trennung von .NET-Sitzung, Anwendung und Authentifizierungs-Informationen. Keine Chance für anwendungsübergreifende Kontamination oder Sicherheitsprobleme (z. B. client1 ändert die URL, um client2 zu sehen).
- Automatische Vererbung von web.config, so dass Sie nicht mehr auf der Festplatte nach der Konfigurationsdatei jedes Clients suchen müssen. Die Einstellungen "funktionieren einfach".
- Jeder Client kann (und ist) so konfiguriert werden, dass er über einen eigenen Anwendungspool verfügt, so dass ein Client keine anderen Probleme in Bezug auf die Leistung verursachen kann.
Nachteile:
- Es gibt erhebliche Speicher-Overhead mit
- Jede Anwendungsinstanz pro Client ein app-Pool mit (zB/client1/app1,/client1/app2,/client2/app1. ..) wird separat von ASP.NET kompiliert, obwohl es nur drei "echte" Anwendungen gibt
- Es gibt App Pool Aufwärmzeit Overhead. Wenn ein Client seit einiger Zeit nicht mehr auf den Server zugegriffen hat, muss der erste Treffer auf den Start des Arbeitsprozesses warten. Ich habe dies gemildert, indem ich alle Pools im 32-Bit-Modus ausgeführt habe.
Mein größtes Problem ist der Speicherverbrauch. Wenn ich curl verwende, um jede Anwendung bei jedem Client zu durchlaufen, trifft jeder Worker-Prozess ungefähr 100 MB RAM. Das bedeutet, dass ich 16 GB Server-RAM für den sicheren Betrieb benötigen würde. Das ist verrückt, wenn man bedenkt, dass die Apps selbst nicht so groß oder schrecklich komplex sind. Der Speicherzusammenbruch für jeden Arbeitsprozess ist grob: Private Bytes 70 MB, Arbeitssatz 85 MB, WS Shared: 32 MB. Speicher ist ein Problem, da dies Cloud-Server sind, deren Kosten direkt mit der RAM-Nutzung zusammenhängen. Selbst wenn es nicht die Kosten wären, scheint es immer noch verrückt zu sein, Speicher so zu verschwenden.
Meine erste Frage ist: Gibt es irgendetwas, was ich tun kann, um IIS oder ASP.NET zu konfigurieren, nicht jede Anwendungsinstanz einzeln zu kompilieren, aber zu erkennen, dass die drei Apps tatsächlich den exakt gleichen Code sind, hoffentlich die Startzeit und reduzieren vielleicht sogar Speicherverbrauch? Wenn ich Clients * Anwendungen * zwei Server, das sind 720 'Anwendungen' auf der Festplatte kompiliert.
Zweite Frage ist eine der besten Praktiken. Ist mein Setup gerecht (aus Mangel an einem besseren Wort)? Ist der RAM-Müll im Interesse der Einfachheit und Sicherheit des Codes wert? Gibt es eine andere Möglichkeit, die Vorteile von Web zu erreichen?config vererbung und session/application/forms auth ohne separate applikationen auf diese weise?
Denken Sie an die Code-Änderungen benötigt, um das Setup zu ändern, so dass es nur drei Anwendungen gibt und für diese Anwendungen Client-bewusst wird, ist ziemlich entmutigend und eine Art von Brutto.
- Hinzufügen von {Client} an die Wurzel jeder MVC Route (eine App ist nicht MVC, so dass anders sein würde)
- Arbeiten mit {Client} für und Laden von Konfigurationsdateien an anderer Stelle auf der Festplatte gespeichert suchen. Vielleicht im json-Format oder so.
- Stellen Sie bei jeder Anforderung sicher, dass sich der {Client} nicht geändert hat. Wenn dies der Fall ist, löschen Sie alle Sitzungs- und Anwendungsvariablen. Deaktivieren Sie den Benutzer, um Sicherheitsprobleme zu vermeiden.
Ich bin nicht auf der Suche nach jemandem, der mich für mich entscheiden würde, aber wenn jemand schon einmal ähnliche Probleme hatte, wäre es nett von ihnen zu hören. Oder vielleicht wird es Konsens darüber geben, dass ich total falsch liege und meinen Code und Setup ändern muss. Ich denke, jede Art von Feedback zu den Themen wäre nützlich und sicherlich geschätzt.
Ich denke nicht, dass es eine einfache Antwort für diese Frage gibt, wenn Sie die gesamte Anwendung nicht als Single-Instance-Multi-Tenant-Anwendung neu schreiben. Dann müssen Sie sich auch mit dem Geschäft und der bestehenden Service-Level-Vereinbarung mit den Kunden auseinandersetzen. Einige Kunden möchten nicht, dass der App-Pool oder die Datenbank aufgrund von Sicherheitsbedenken mit anderen Kunden geteilt wird. Ich schlage vor, zuerst Ihre Service-Level-Vereinbarung zu überprüfen, und Sie werden feststellen, dass Sie dies tatsächlich so beibehalten müssen. – airmanx86
Übrigens, Sie könnten das Kompilieren etwas vereinfachen, indem Sie einen gemeinsam genutzten Code oder die gesamte Webanwendung in einer Assembly unterschreiben, als MSI-Datei verpacken und im GAC des Servers installieren. – airmanx86
Irgendwie habe ich es in meiner Karriere so weit geschafft, ohne die "Multi-Tenant" -Terminologie zu kennen, obwohl ich das schon seit Jahren mache. Jetzt habe ich zumindest einen guten Begriff, um im Internet zu suchen. Vielen Dank! Nun, da ich weiß, wonach ich suchen muss, bin ich anscheinend nicht die einzige Person, die dieses Problem hat. Darin liegt ein gewisser Trost. – mroach