Es scheint, dass WCF I/O-Threads aus dem CLR Threadpool auf Service-Anfragen mit dem zusätzlichen Vorbehalt verwaltet verwendet, die einen eigenen Thread Scheduler verwendet.
Von Wenlong Dong's Blog - Why Are WCF Responses Slow and SetMinThreads Does Not Work?
Zu allererst WCF verwendet verwaltete I/O-Threads Anfragen zu bearbeiten. Der CLR-ThreadPool verhindert, dass eine bestimmte Anzahl von Leerlauf-E/A-Threads zerstört wird. Wenn mehr E/A-Threads benötigt werden, werden sie vom ThreadPool erstellt, was ziemlich teuer ist.
Von Wenlong Dong's Blog : WCF Request Throttling and Server Scalability
In .NET 3.0 und 3.5, gibt es ein spezielles Verhalten, das Sie für IIS gehostete WCF-Dienste beobachten würde. Wenn eine Anforderung eingeht, verwendet das System zwei Threads, um die Anforderung zu verarbeiten: Ein Thread ist der CLR-ThreadPool-Thread, bei dem es sich um den aus ASP.NET stammenden Worker-Thread handelt. Ein anderer Thread ist ein E/A-Thread, der von WCF IOThreadScheduler verwaltet wird (tatsächlich erstellt von ThreadPool.UnsafeQueueNativeOverlapped).
Es gibt eine Vielzahl von Einstellungen, die zum WCF-Durchsatz beitragen. Da WCF den verwalteten ThreadPool verwendet, wirken sich die MinIOThreads- und MaxIOThreads-Einstellungen des ThreadPools auf das Ergebnis aus. Nachdem alle nicht benötigten I/O-Threads (oder Worker-Threads, wenn Sie diese verwendet haben) aus dem ThreadPool übernommen wurden, wird der ThreadPool für eine gewisse Zeit verzögert, bevor ein neuer Thread zum Bedienen einer in der Warteschlange befindlichen Anfrage gestartet wird. Durch Erhöhen von MinIOThreads können Sie diese Verzögerung verhindern. Wenn Sie das MaxIOThread-Limit erreichen, würde dies sicherlich die Anzahl gleichzeitiger Anfragen begrenzen, die Sie sehen würden. Dies scheint jedoch in Ihrem 50/100-Test nicht der Fall zu sein, da Ihr nächster Test 160 gleichzeitige Anfragen ausführen konnte. Wenn ich mich richtig erinnere, glaube ich, dass die von Ihnen verwendete Hosting-Umgebung (IIS, WAS, self) einige der ThreadPool-Einstellungen diktieren kann. Wenn Sie den Blogbeitrag von der zweiten Verknüpfung lesen, sehen Sie außerdem, wie IIS-Arbeitsthreads blockiert werden, wenn WCF eine Anforderung für seinen separaten E/A-Thread verarbeitet. In diesem Fall wirken sich die Worker-Thread-Einstellungen und IIS-Einstellungen auf die WCF-Parallelität aus. Wie hosten Sie diesen Service?
Ihr Titel erwähnt einen PerCall InstanceContextMode, der den ConcurrencyMode irrelevant macht. Mit PerCall müssen Sie jedoch die MaxConcurrentInstances-Einstellung sowie die MaxConcurrentCalls beachten. Abhängig von Ihrer Bindung müssen Sie möglicherweise auch mit der MaxConcurrentSessions-Eigenschaft befasst sein. Welche Bindung verwenden Sie, um diesen Service zu hosten?
Unabhängig von all dem, was verblüffend ist, ist der 160/200 Test, der Ihrem 50/100 Test folgte.
Soweit ich weiß, WCF verwendet einen separaten Pool von Threads für seine Anforderungen. Es greift nicht auf den "normalen" .NET ThreadPool zu. –