Wie man sich selber eine Grube gräbt ....
C# .Net ASP.NET
Es ist ja nicht einfach mit mehreren Threads umzugehen und wenn man es dann meint zu können, dann kommt einem mal wieder was dazwischen ....
Kategorie Es ist ja nicht einfach mit mehreren Threads umzugehen und wenn man es dann meint zu können, dann kommt einem mal wieder was dazwischen ....
Zur Geschichte ....
Es war einmal ein Rechner, der hatte 32 GB RAM darauf lief ein SQL-Server, welcher die Freiheit hatte sich 16 GB zu nehmen.
Weiterhin lief darauf ein ASP.NET Webservice, welchem erlaubt war maximal 400 Threads für Berechnungen parallel zu starten.
Wie der Zufall so will, waren alle glücklich und zufrieden, bis nach einigen Performance Optimierungen es hin und wieder mal vorkam, dass der Rechner meinte sich 5 Sekunden hinweg 100% CPU zu beanspruchen.
Dies wäre im Allgemeinen auch nicht so schlimm gäbe es keine User, welche von dem ASP.NET WebService auch zu Zeiten erhöhter Auslastung gerne eine Antwort hätten.
Nach einigen Recherchen, kam heraus, dass die 100%-ige Auslastung des Rechners mit dem Thread-Context-Swicht-Performance Indikator korrellierte.
Dies kam wohl daher, dass durch die Performance Optimierungen die Threads wesentlicher abgearbeitet werden konnten und die Wahrscheinlichkeit, dass alle 400 zur gleichen Zeit am Start waren, sich erhöhte
Na ja, ein wenig Nachdenken und Huch es gibt ja die Klasse ThreadPool.... Also schnell was implementiert und den ThreadPool auf 200 gestellt.
Annahme: Es wird halb so schnell berechnet, aber der Rechner ist ja schnell, von daher kein Problem. CPU Auslastung sinkt und alle zufrieden
Schnell auf einer Testmaschine implementiert, Ergebnis es funktioniert! CPU-Auslastung besser!!!
Jetzt der große Moment! Deployment in die Produktivumgebung
Taskmanager an -> Siehe da, die CPU-Auslastung über 10 Minuten stetig unter 60%
Gewonnen!!!
Sekt aufmachen und trinken.....
Dann die Ernüchterung: Support meldet, dass alle User keinen Zugriff mehr hatten !!
Was war geschehen......
Durch das Setzen der maximalen Anzahl der Threads, wurden auch im zugrunde liegenden Application Pool die Anzahl der Threads, welche zur Bearbeitung von WebService-Requests zur Verfügung stehen auf 200 gesetzt.
Da diese jedoch von der Berechnungsroutine belegt wurden, waren für die User keine Abfragen mehr möglich
Morgen werden ich wohl Miscellaneous Utility Library ausprobieren.
Nach der Theorie sollte es wohl funktionieren, wenn Microsoft nicht anderer Meinung ist.
Gruß JJR