ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Helios を使うとワーカースレッド数が制限されていた話

まだ、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 は今後のアップデートで変わってくると思いますので、あくまで現時点の情報ということになります。