Kestrel(Ubuntu) で ASP.NET Core Web API を実行していますが、奇妙な状況に直面しました: 最初の 20 回の一連の API 呼び出しを実行すると、最初の 3 ~ 5 回の呼び出しが非常に遅くなり、応答時間が遅くなります。わかった。次に、短い遅延 (1 分またはそれ以下) を作成し、一連の API 呼び出しを再度実行します。最初の数回の呼び出しは非常に遅く、最初の 3 ~ 5 回の呼び出しの後にのみ、応答時間が問題ありません。
当初、問題は Kestrel の構成にあると考えたので、次の設定を行いました。
var host = new WebHostBuilder()
.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = 200;
options.Limits.MaxConcurrentUpgradedConnections = 200;
options.Limits.MaxRequestBodySize = 10000;
options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
options.Limits.KeepAliveTimeout = TimeSpan.FromDays(2);
})
.UseConfiguration(config)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
サービスの動作を高速化するのに役立ちましたが、問題はまだ解決していません。
サービスの基本的なロジックは次のとおりです。1) リクエスト オブジェクトを取得します。2) POCO クラスのインスタンスに解析します。3) 複数の SELECT を使用して DB を呼び出し、必要なすべてのデータを取得します (この目的のために Dapper を使用しています)。および複数のSQLクエリを一度に実行できる方法) 4)オブジェクトのインスタンスを新しく受け取ったデータで更新し、オブジェクトをDBに挿入します
それでおしまい。
そして、この遅延(アイドル時間)の原因がわかりません。
サービスを実行し続けるために、ダミーの呼び出しをいくつか行う必要があるのではないかと推測しました。そのため、Timer ジョブを含む Singleton を追加して、DB にクエリを実行し、毎分いくつかのルックアップ データを取得しました。しかし、それは役に立ちませんでした。
次に、ステップ N3 で DB の 1 番目のレコードだけに必要なデータをクエリする別のタイマー ジョブを追加しようとしましたが、特定の req パラメータを使用せずに、役に立ちませんでした。さらに、動作が遅くなりました。
また、テーブルにインデックスを追加して、SELECT をより高速に動作させ、さらにすべての SELECT に WITH(NOLOCK) ステートメントを追加しましたが、役に立ちませんでした。
アイデアはありますか?