[ この投稿は2012-09-02の時点で最新です(上記より新しい)。]
Node.jsは、マルチコアマシンで完全にスケーリングします。
はい、Node.jsはプロセスごとに1つのスレッドです。これは非常に慎重な設計上の決定であり、ロッキングセマンティクスを処理する必要がなくなります。これに同意しない場合、マルチスレッドコードのデバッグがいかに非常に難しいかをまだ理解していないでしょう。Node.jsプロセスモデルの詳細な説明、およびNode.jsプロセスモデルがこのように機能する理由(および複数のスレッドをサポートしない理由)については、他の投稿を参照してください。
では、16コアボックスを活用するにはどうすればよいですか?
二通り:
- 画像のエンコーディングのような非常に重い計算タスクの場合、Node.jsは子プロセスを起動したり、追加のワーカープロセスにメッセージを送信したりできます。この設計では、イベントのフローを管理する1つのスレッドと、重い計算タスクを実行し、他の15個のCPUを消費するN個のプロセスがあります。
- Webサービスのスループットをスケーリングするには、1つのボックスで複数のNode.jsサーバーをコアごとに1つ実行し、リクエストトラフィックをサーバー間で分割する必要があります。これは優れたCPUアフィニティを提供し、コア数とほぼ直線的にスループットをスケーリングします。
Webサービスでのスループットのスケーリング
v6.0.X以降、Node.jsにはそのまますぐにクラスターモジュールが含まれるため、単一のポートでリッスンできる複数のノードワーカーを簡単に設定できます。これは、npmを介して利用できる古いlearnboost "クラスター"モジュールと同じではないことに注意してください。
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
労働者は新しい接続を受け入れるために競争し、最も負荷の少ないプロセスが勝つ可能性が最も高いです。これはかなりうまく機能し、マルチコアボックスでスループットをかなりスケールアップできます。
複数のコアを気にするのに十分な負荷がある場合は、さらにいくつかのことを実行する必要があります。
Node.jsサービスをNginxやApacheなどのWebプロキシの背後で実行します。これは、接続の絞り込み(過負荷状態によってボックスを完全にダウンさせたくない場合)、URLの書き換え、静的コンテンツの提供、その他のサブサービスのプロキシを実行できるものです。
定期的にワーカープロセスをリサイクルします。実行時間の長いプロセスの場合、小さなメモリリークでも最終的には加算されます。
セットアップログの収集/監視
PS:アーロンとクリストファーの間の別の投稿のコメントでの議論があります(この執筆時点で、そのトップの投稿)。それに関するいくつかのコメント:
- 共有ソケットモデルは、複数のプロセスが単一のポートでリッスンし、新しい接続の受け入れを競うことを可能にするのに非常に便利です。概念的には、フォークされたApacheがこれを行うと考えると、各プロセスは単一の接続しか受け入れずに終了するという重要な警告があります。Apacheの効率の低下は、新しいプロセスの分岐によるオーバーヘッドであり、ソケット操作とは何の関係もありません。
- Node.jsの場合、N個のワーカーを単一のソケットで競合させることは非常に合理的なソリューションです。別の方法として、Nginxのようなオンボックスのフロントエンドをセットアップし、個々のワーカーへのプロキシトラフィックを使用して、ワーカー間で交互に新しい接続を割り当てます。2つのソリューションのパフォーマンス特性は非常に似ています。そして、上で述べたように、とにかくNginx(または別の方法)がノードサービスの前に立つことを望んでいるため、ここでの選択は本当に次のいずれかになります。
共有ポート: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
対
個々のポート: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
個々のポートのセットアップには間違いなくいくつかの利点があります(プロセス間のカップリングが少ない可能性、より高度なロードバランシングの決定などがある可能性があります)が、セットアップするのは間違いなく多くの作業であり、組み込みのクラスターモジュールは低い-ほとんどの人のために働く複雑な代替手段。