まだ、Version 1.0.0 - alpha 1 ですが、Project Helios を使った Web アプリケーションでは、リクエストの実行に使用するワーカースレッドと完了ポートスレッドの数が制限されていました。
気が付いたきっかけは、Azure Web サイトにデプロイして動かした際に、例外が発生したことでした。
System.InvalidOperationException:There were not enough free threads in the ThreadPool to complete the operation.
次のようなテスト用の Web API を Azure Web サイトにデプロイして、確認してみました。
#TestController.cs public class Test { public int MaxWorkerThreads { get; set; } public int MaxCompletionPortThreads { get; set; } public int ProcessorCount { get; set; } } [Route("api/test")] public class TestController : ApiController { public IHttpActionResult Get() { int workerThreads = 0; int completionPortThreads = 0; ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads); int processorCount = Environment.ProcessorCount; return base.Ok(new Test { MaxWorkerThreads = workerThreads, MaxCompletionPortThreads = completionPortThreads, ProcessorCount = processorCount }); } }
無料・共有(Heliosなし) | 無料・共有(Heliosあり) | 基本・標準(Heliosなし) | 基本・標準(Heliosあり) | |
---|---|---|---|---|
MaxWorkerThreads | 8191 | 16 | 8191 | 2 |
MaxIoThreads | 1000 | 16 | 1000 | 2 |
ProcessorCount | 8 | 8 | 1 | 1 |
基本と標準は、Sインスタンスです。上記の結果の通り、Helios を使うと、論理コア数あたり2個が設定されています。なお、Visual Studio 14 CTP 4 の ASP.NET vNext でも、Helios と同様の値が設定されていました。
ワーカースレッド数を変更するとしたら、こちらの推奨値を参考にすると、このような感じでしょうか?
#Startup.cs public class Startup { public void Configuration(IAppBuilder app) { int processorCount = Environment.ProcessorCount; ThreadPool.SetMaxThreads(100 * processorCount, 100 * processorCount); var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); app.UseWebApi(config); app.UseWelcomePage(); } }
Helios の正式版がリリースされる可能性は低いですが、ASP.NET vNext は今後のアップデートで変わってくると思いますので、あくまで現時点の情報ということになります。