web-dev-qa-db-ja.com

AspNetCore(Kestrel)リクエストがタイムアウトしました

私は次の設定をしています:アプリケーションロードバランサー(AWS)の背後にあるいくつかのLinuxコンテナー(aspnetcore 2.0.5上に構築)で実行されているWeb API

HttpClientを使用してこのAPIにリクエストを行っているクライアント。クライアントは複数のタスクの呼び出しを並行して実行しています。並列タスクの数が増えると、APIは「リクエストがタイムアウトしました」というメッセージで例外をスローし始めます。

呼び出しスタックは次のとおりです。

microsoft.AspNetCoreでMicrosoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.PipeCompletion.ThrowFailed()でMicrosoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.GetResult(ReadResult&result)で.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.IReadableBufferAwaiter.GetResult()(Microsoft.AspNetCore.Server.Kestrel.Internal.System.IOで) .Pipelines.ReadableBufferAwaitable.GetResult()at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext()---例外がスローされた前の場所からのスタックトレースの終わり---システム。 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext()のRuntime.ExceptionServices.ExceptionDispatchInfo.Throw()

タイムアウトを設定しているこのエラーの原因は何ですか?これをさらに調査するにはどうすればよいですか?

編集:失敗したリクエストを取得するためにフィドラーを試した場合、エラーはもうスローされません(おそらく、フィドラーが並列度の低い接続を開いています)。

7
mslliviu

考えられる原因の1つは、I/Oバインド操作が原因であり、asp.netスレッドをブロックしています。問題の説明から、サーバーは特定のポイントまでリクエストを処理しているようです。それを超えてそれを行うことはできません。

Async/Awaitを正しく使用すると、現在の制限よりも多くの同時リクエストに対応できないと思います。

また、Asp.Netスレッドを増やすことができない場合は、構成で確認してください。従来のAsp.Netはこれをサポートしています。 Asp.Net Coreにこの機能があるかどうかは不明です。

最後に、クラウドで実行しているので、サーバー構成をアップグレードする可能性を確認します。アップグレードされた構成は、より多くの要求を処理するのに役立ちます。明らかにこれが最後の選択です。まず、既存のハードウェアを使用してアプリケーションのパフォーマンスを向上させることに焦点を当てます。

0
parag