Mehrere Cores für eine einzelne ASP.net-Anfrage

8

Ich versuche eine WebApi-Methode zu erstellen, die eine Reihe von Schleifenberechnungen ausführt, deren weitere Optimierung schwierig ist.

%Vor%

Wenn dieser Code ausgeführt wird und der Server-Task-Manager betrachtet wird, scheint es, dass er nur einen einzelnen Prozessorkern auslastet, während die anderen Kerne unberührt bleiben.

Nach dem, was ich gelesen habe, beschränkt asp.net eine einzelne Anfrage auf einen Prozessorkern. Da es sich um einen Intranetserver mit sehr geringen Gesamtanforderungen handelt, geht es mir nicht um die Verwaltung der Serverressourcen.

Gibt es eine Möglichkeit, dieses Verhalten zu überschreiben oder zu umgehen, damit meine Schleife schneller ausgeführt wird?

    
phosplait 05.11.2015, 16:28
quelle

1 Antwort

1

ASP.Net kann die Anzahl der Threads, die auch für TPL verwendet werden, auf sehr saubere Weise begrenzen. Einfach durch Erstellen eines TaskSchedulers, der auf einen Thread beschränkt ist und die ASP.Net-Anfrage auf einem gegebenen TaskScheduler startet. Ich wette, sie hätten einen Pool dieser limitierten TaskScheuler, es würde Sinn machen ...

Was passiert dann in der Task, die die ASP.Net-Anfrage verarbeitet, wenn Sie TPL oder PLINQ aufrufen?

Das Planen von Tasks mit Aufrufen von Task.Start oder noch besser und vom TPL-Team ist die bevorzugte Methode Task.Factory.StartNew.

ABER, ABER: Diese Aufgaben werden auf TaskScheduler.Current geplant, und das ist unser begrenzter TaskScheduler, auf dem wir bereits laufen! So werden alle geplanten Aufgaben auf dem begrenzten TaskScheduler ausgeführt, egal wie viele Kerne Ihr Computer hat.

Auf der anderen Seite scheint es, dass async / await-Operationen neue Tasks.Run () verwenden, die in .Net 4.5+ eingeführt wurden, und es wurde vorgeschlagen, Tasks auf TashScheduler.Default zu planen, was ist der ThreadPool selbst, also keine Beschränkung, außer der Anzahl der Kerne. Ich habe keinen Beweis, obwohl andere als diese führen: In Bezug auf die Verwendung von Task.Start (), Task.Run () und Task.Factory.StartNew () TPL

Leider hat AsParallel () keine Überladung mit TaskScheduler.

Also wäre die Lösung:

  1. Die erste, die bereits von @S K vorgeschlagen wurde, um die Klasse Parallel zu verwenden und den Grad der Parallelität anzugeben. Die Klasse ist älter als PLINQ und verwendet den ThreadPool so, wie es passt.
  2. Die zweite Idee wäre, sich selbst auf ThreadPool zu programmieren.
  3. Oder planen Sie Aufgaben auf TaskScheduler.Default, die auf ThreadPool ausgerichtet sind.
  4. Oder spawn eigene Threads (am schlechtesten Idee) für ASP.Net.
  5. Oder verwenden Sie async / await zur Ausführung von TaskScheduler.Default, ThreadPool und in der async-Methode AsParalel (), da TaskScheduler.Current dasselbe wie TaskScheduler.Default ist, einfach ThreadPool.

ACHTUNG: Bitte beachten Sie, dass das Planen von schweren Sachen auf ThreadPool in ASP.Net zu einer abnehmenden Performance bei der Verarbeitung von ASP.Net-Anfragen führen kann ...

    
ipavlu 08.11.2015 00:34
quelle

Tags und Links