Node.jsと.Netのパフォーマンス 質問する

Node.jsと.Netのパフォーマンス 質問する

Node.js は高速で、大量の負荷に対応できるという話をよく聞きます。他のフレームワーク、特に .Net と比較して、この点が優れているという実際の証拠をお持ちの方はいらっしゃいますか? 私が読んだ記事のほとんどは逸話的なものか、.Net との比較がありません。

ベストアンサー1

高速であることと大量の負荷を処理することは別物です。1 秒あたり 1 件のリクエストを処理するのに非常に高速なサーバーでも、1 秒あたり 500 件のリクエスト (負荷時) を送信すると完全にクラッシュする可能性があります。

また、静的 (およびキャッシュされた) ページと動的ページについても考慮する必要があります。静的ページが心配な場合は、IIS がおそらく node よりも優れているでしょう。IIS はカーネル モード キャッシュを使用するため、静的ページを要求するリクエストはカーネルから出ることさえありません。

ASP.NET と node の比較を探しているのだと思います。この戦いでは、すべてがコンパイル/解釈された後、パフォーマンスはおそらくかなり近いものになるでしょう。.NET の方が少し速いかもしれませし、node の方が少し速いかもしれません。しかし、おそらくあまり気にしないくらい近いでしょう。私なら .NET に賭けますが、確かなことはわかりません。

ノードが本当に魅力的なのは、LOADの処理です。ここが、テクノロジが本当に異なるところです。ASP.NET は、スレッド プールからの各要求に対してスレッドを専用に割り当て、ASP.NET が利用可能なスレッドをすべて使い果たすと、要求はキューに入れられ始めます。@shankar の例のような「Hello World」アプリを提供している場合、これはそれほど問題にならないかもしれません。スレッドはブロックされず、スレッドがなくなる前に多くの要求を処理できるからです。ASP.NET モデルの問題は、スレッドをブロックする I/O 要求 (DB への呼び出し、サービスへの http 要求、ディスクからのファイルの読み取り) を開始したときに発生します。これらのブロック要求は、スレッド プールの貴重なスレッドが何もしないことを意味します。ブロックが多くなるほど、ASP.NET アプリが処理できるLOADは少なくなります。

このブロッキングを防ぐには、応答を待つ間スレッドを保持する必要がない I/O 完了ポートを使用します。ASP.NET はこれをサポートしていますが、残念ながら .NET の一般的なフレームワーク/ライブラリの多くはサポートしていません。たとえば、ADO.NET は I/O 完了ポートをサポートしていますが、Entity Framework はそれを使用しません。したがって、完全に非同期で大量の負荷を処理する ASP.NET アプリを構築できますが、同期アプリを構築するほど簡単ではないため、ほとんどの人はそうしません。また、そうするとフレームワークのお気に入りの部分 (linq to entities など) を使用できなくなる可能性があります。

問題は、ASP.NET (および .NET Framework) が非同期 I/O に関して偏りのない設計になっていることです。.NET は同期コードと非同期コードのどちらを書くかは気にしないので、開発者が決定を下すことになります。その理由の 1 つは、非同期操作によるスレッド化とプログラミングは「難しい」と考えられていたため、.NET は初心者も専門家も全員を満足させたかったからです。.NET では非同期を行うためのパターンが 3 ~ 4 種類になったため、さらに難しくなりました。.NET 4.5 では、.NET Framework を見直して、非同期 IO に関する偏りのないモデルにしようとしていますが、関心のあるフレームワークが実際にそれをサポートするまでにはしばらく時間がかかるかもしれません。

一方、Node の設計者は、すべての I/O を非同期にするという独自の選択を行いました。この決定により、Node の設計者は、スレッドの切り替えを最小限に抑えるために各インスタンスをシングル スレッドにし、1 つのスレッドでキューに入れられたコードのみを実行するという決定を下すことができました。これは、新しいリクエスト、DB リクエストからのコールバック、またはユーザーが行った http REST リクエストからのコールバックである可能性があります。Node は、スレッド コンテキストの切り替えを排除することで CPU 効率を最大化しようとします。Node は、すべての I/O を非同期にするという独自の選択を行ったため、すべてのフレームワーク/アドオンがこの選択をサポートしていることも意味します。Node では、100% 非同期のアプリを作成する方が簡単です (Node では非同期のアプリの作成が強制されるため)。

繰り返しになりますが、どちらが正しいかを証明する確かな数字はありませんが、一般的な Web アプリの LOAD 競争では Node が勝つと思います。高度に最適化された (100% 非同期) .NET アプリは、同等の node.js アプリに匹敵するかもしれませんが、すべての .NET アプリとすべての Node アプリの平均をとれば、平均すると Node の方がより多くの LOAD を処理できるでしょう。

おすすめ記事