非同期モデルは、適切に構成された同期モデルと比較して、スループットの点で本当にメリットがありますか?

スケーラビリティ、はい。スループット:場合によります。各非同期リクエストは遅い したがって、スケーラビリティが有効になった場合 (つまり、利用可能なスレッドよりも多くのリクエストがある場合) にのみ、スループットの利点が見られます。

さて、問題は「正しく構成されたスレッド プール」です。あなたが想定しているのは、1) 負荷を予測できること、および 2) 要求ごとに 1 つのスレッドを使用してそれを処理するのに十分な大きさのサーバーを用意できることです。多くの (ほとんどの?) 実世界の生産シナリオでは、これらのいずれかまたは両方が当てはまりません。

非同期 ASP.NET に関する私の記事から:

まず、非同期コードは同期コードよりも拡張性があります。より現実的なコード例では、合計 ASP.NET サーバーのスケーラビリティ (ストレス テスト済み) は、倍数の増加を示しました。つまり、非同期サーバーは、同期サーバーの数倍の連続要求を処理できます (両方のスレッド プールをそのハードウェアの最大値まで上げた場合)。ただし、これらの実験 (私が行ったものではありません) は、平均的な ASP.NET アプリの予想される "現実的なベースライン" で行われました。同じ結果が noop 文字列の戻り値にどのように引き継がれるかわかりません。

第 2 に、非同期コードは同期コードよりも高速にスケーリングされます。これは明らかです。同期コードは、スレッド プール スレッドの数まで問題なくスケーリングしますが、スレッド インジェクション レートより速くスケーリングすることはできません。そのため、応答時間グラフの最初に示されているように、突然の重い負荷に対して応答が非常に遅くなります。

あなたが行った仕事は興味深いと思います。特に、メモリ使用量の違い (というか、違いがないこと) には驚かされます。これをブログ記事にまとめていただければ幸いです。推奨事項:

  • テストには ASP.NET Core を使用します。古い ASP.NET には、部分的に非同期のパイプラインしかありませんでした。同期と非同期をより「純粋に」比較するには、ASP.NET Core が必要です。
  • ローカルでテストしないでください。その際、注意点がたくさんあります。 VM のサイズ (または単一インスタンスの Docker コンテナなど) を選択し、再現性についてクラウドでテストすることをお勧めします。
  • 負荷テストに加えて、ストレス テストも試してください。サーバーが完全に圧倒されるまで負荷を増やし続け、非同期サーバーと同期サーバーの両方がどのように応答するかを確認します。

最後のリマインダーとして (これも私の記事から):