KestrelはNode.jsのようにリクエストの処理にシングルスレッドを使っているのでしょうか?
質問
どちらも ケストレル と Node.js は libuv .
Node.jsでは、正確に イベントループ を使用すると書いてありますが、Kestrelがそうなのか、それともIISのようにスレッドプーリング/リクエストキューを利用するのか、見つけることができないようです。
Web サーバーの背後にある Kestrel
Node.jsのイベントループ
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
どのように解決するのですか?
ASP.Net Core 2.0用に更新しました。
. poke さんのご指摘の通り、サーバはホスティングとトランスポートに分かれており、libuv はトランスポート層に属しています。libuv の
ThreadCount
はそれ自身の
LibuvTransportOptions
で、これらはウェブホストビルダーで別々に設定されます。
UseLibuv()
ext メソッドで設定します。
-
を確認すると
LibuvTransportOptions
クラスをgithubで確認するとThreadCount
というオプションがあります。/// <summary> /// The number of libuv I/O threads used to process requests. /// </summary> /// <remarks> /// Defaults to half of <see cref="Environment.ProcessorCount" /> rounded down and clamped between 1 and 16. /// </remarks> public int ThreadCount { get; set; } = ProcessorThreadCount;
-
の呼び出しで、オプションを設定することができます。
UseLibuv
の呼び出しで設定できます。例えばpublic static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseLibuv(opts => opts.ThreadCount = 4) .UseStartup<Startup>() .Build();
ASP.NET Core 1.Xでは、Libuv configはkestrelサーバーの一部でした。
-
を確認すると
KestrelServerOptions
クラスを確認すると、その github リポにあるThreadCount
オプションがあります。/// <summary> /// The number of libuv I/O threads used to process requests. /// </summary> /// <remarks> /// Defaults to half of <see cref="Environment.ProcessorCount" /> rounded down and clamped between 1 and 16. /// </remarks> public int ThreadCount { get; set; } = ProcessorThreadCount;
-
の呼び出しで、オプションを設定することができます。
UseKestrel
を呼び出す際に設定できます。public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel(opts => opts.ThreadCount = 4) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); }
ソースコードを掘り下げる。
-
libuv リスナーのスレッド (または
KestrelThreads
) が作成されていることがわかります。KestrelEngine
-
場所によっては
ThreadPool
メソッドを呼び出し、libuv スレッドの代わりに CLR スレッドプールでコードを実行できるようにします。(使用するThreadPool.QueueUserWorkItem
). プールはデフォルトで 最大 32K スレッド となっているようですが、これは変更可能で 設定により . -
は
Frame<TContext>
は、リクエストを処理するために実際のアプリケーション (ASP.Net Core アプリケーションなど) に委譲します。
つまり、IOのために複数のlibuvイベントループを使用していると言えます。実際の作業は、CLR スレッドプールを使用した標準的なワーカスレッドによるマネージドコードで行われます。
これに関するもっと権威あるドキュメントを見つけたいのですが ( 公式ドキュメント はあまり詳細を与えてくれません)。私が見つけた中で最も良いものは、Damian Edwards が チャンネル 9 . 12分ごろに彼が説明しています。
- libuv はシングルスレッドイベントループモデルを使用します。
- Kestrel は複数のイベントループをサポートする
- Kestrel は libuv イベントループの IO 作業のみを行います。
- すべての非 IO 作業 (解析、フレーミングなどの HTTP に関連するものを含む) は、標準の .net ワーカスレッド上のマネージドコードで行われます。
さらに、クイック検索で戻ってきました。
関連
-
[解決済み] アプリケーション依存関係マニフェスト(...)で指定されたアセンブリが見つかりませんでした。
-
[解決済み】AspNet Core scaffoldedアプリのLoginとRegisterページはどこにありますか?
-
[解決済み] asp.net core 1.0 でビューの現在の URL を取得する方法
-
[解決済み] ConfigureServicesメソッドでIHostingEnvironmentにアクセスする
-
[解決済み] kestrel Web サーバーが localhost 以外のリクエストを聞くようにするにはどうすればよいですか?
-
[解決済み] dotnet publish が正しい appsettings.{env.EnvironmentName}.json をパブリッシュしない。
-
.NET Coreをインストール/アップグレードするためのコマンドライン
-
IHostingEnvironment' は廃止されました。
-
データベースファーストの手法でモデルを更新する方法
-
コマンドラインから開発環境を使ってdotnet run OR dotnet watch?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】.NET CoreとASP.NET Coreの比較
-
[解決済み】AspNet Core scaffoldedアプリのLoginとRegisterページはどこにありますか?
-
[解決済み] .NET Core MVCのページが変更後にリフレッシュされない
-
[解決済み] ASP.NET Core 2.2 -> 3.0 アップグレード env.IsDevelopment() が見つかりませんでした。
-
[解決済み] asp.net core 1.0 でビューの現在の URL を取得する方法
-
[解決済み] ConfigureServicesメソッドでIHostingEnvironmentにアクセスする
-
[解決済み] .NET Core - "dotnet new sln "を使用する場合
-
[解決済み] Visual Studio 2019でASP.NET Core 3.0が表示されない
-
[解決済み] dotnet publish が正しい appsettings.{env.EnvironmentName}.json をパブリッシュしない。
-
IHostingEnvironment' は廃止されました。