node.js でマルチコア CPU を最大限に活用する方法

node.js でマルチコア CPU を最大限に活用する方法

概要

Nodejs は Chrome ブラウザの V8 エンジンに基づいて構築されているため、そのモデルはブラウザのモデルに似ています。 JavaScript は単一プロセス内の単一スレッドで実行されます。

しかし、V8エンジンのシングルプロセス、シングルスレッド構造は完璧な構造ではありません。昨今のCPUは基本的にマルチコアです。実際のサーバーには複数の CPU が搭載されていることがよくあります (オンラインの物理マシンには 12 個のコアが搭載されているなど)。そのため、Nodejs の実際の適用では、「マルチコア CPU サーバーを最大限に活用するにはどうすればよいか」という疑問が生じます。

厳密に言えば、Node は真のシングルスレッド アーキテクチャではありません。Node 自体に I/O スレッド (ネットワーク I/O、ディスク I/O) があるためです。これらの I/O スレッドは、JavaScript 開発者にとって透過的な低レベルの libuv によって処理されます。 JavaScript コードは常に V8 上で実行され、シングルスレッドです。したがって、表面的には NodeJS はシングルスレッドです。

node.js でマルチコア CPU を最大限に活用する方法

シングルプロセスおよびシングルスレッドのマルチコア利用率が低いという問題に直面していますが、これまでの経験によれば、各プロセスは 1 つの CPU を使用してマルチコア CPU の利用を実現できます。 Node は、child_process モジュールを提供し、プロセスのレプリケーションを実装するための fork() メソッドも提供します (プロセスがレプリケーションされる限り、一定のリソースと時間が必要です。Node では、プロセスをレプリケーションするために 10 MB 以上のメモリと 30 ミリ秒以上が必要です)。

このようなソリューションは、*nix システムで最も古典的なマスター ワーカー モードであり、マスター スレーブ モードとも呼ばれます。

典型的な並列処理ビジネス モデルのこの分散アーキテクチャは、優れたスケーラビリティ (スケーラビリティは、実際には並列アルゴリズムおよび並列コンピュータ アーキテクチャと一緒に議論されます。特定のマシン上のアルゴリズムのスケーラビリティは、アルゴリズムが増加する CPU の数を効果的に利用できるかどうかを反映します) と安定性を備えています。

メインプロセスは特定の業務処理を担当するのではなく、作業プロセスのスケジュールと管理を担当します。作業プロセスは特定の業務処理を担当するため、開発者は作業プロセスの安定性に注意を払う必要があります。

fork() によってコピーされたプロセスは独立したプロセスであり、独立した新しい V8 インスタンスを持ちます。 Node は各 CPU コアを使用できるようにプロセスをコピーする fork() を提供していますが、fork() プロセスは非常にコストがかかるということを覚えておくことが重要です。幸いなことに、Node はイベント駆動を通じて単一のスレッドで大規模な同時リクエストを処理できます。

注: ここで複数のプロセスを開始するのは、CPU リソースを最大限に活用するためであり、同時実行の問題を解決するためではありません。

Node で子プロセスを作成する 4 つの方法

1. スポーン()

コマンドを実行するサブプロセスを作成する

2. 実行()

コマンドを実行するための子プロセスを作成します。spawn() との違いは、メソッドのパラメータが異なることです。子プロセスのステータスを取得するためにコールバック関数を渡すことができます。

3. execFile()

指定されたファイルを実行するサブプロセスを開始します。プロセス タイプを指定するには、ファイルの先頭で SHEBANG シンボル (#!) を宣言する必要があることに注意してください。

4. フォーク()

spawn() と似ていますが、違いは、Node 子プロセスを作成するために JavaScript ファイル モジュールを実行するだけでよいことです。

注: 次の 3 つのメソッドは、spawn() の拡張アプリケーションです。

上記は、node.js がマルチコア CPU を最大限に活用する方法の詳細です。node.js がマルチコア CPU を最大限に活用する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • フロントエンドのプログレッシブフレームワークVUEの簡単な紹介
  • vuex プログレッシブチュートリアルのサンプルコードの詳細な説明
  • Spring Boot Web アプリケーション構成の詳細な説明
  • Spring Boot を使用して Web アプリケーションを作成するためのサンプル コード
  • NodeJs の高メモリ使用量のトラブルシューティング実戦記録
  • Nodejs 組み込み暗号化モジュールを使用してピアツーピアの暗号化と復号化を実現する詳細な説明
  • Node.js での組み込みモジュールとカスタムモジュールの実装
  • Node.js コード実行をバイパスするためのヒントのまとめ
  • プログレッシブ ウェブ アプリ (PWA) の開発方法

<<:  CentOS プラットフォーム上で LAMP 環境を素早く構築する方法

>>:  LinuxベースのApacheウェブサイトサービス構成の詳細な説明

推薦する

MySQL テーブル削除操作の実装 (delete、truncate、drop の違い)

この記事では主に、MySQL でテーブルを削除する 3 つの操作、つまり delete ステートメン...

JavaScript 文字列オブジェクトメソッド

目次文字列オブジェクトのメソッド方法 1: indexOf() (推奨)方法 2: search()...

ubuntu20.04 LTS システムのデフォルト ソース ソース リスト ファイルの変更

誤って source.list の内容を変更し、一連のエラーが発生した場合は、デフォルトのソース フ...

uniapp vue および nvue カルーセル コンポーネントのサンプル コード

vueの部分は以下のとおりです。 <テンプレート> <ビュークラス="&...

node.js で Web サーバーを作成する手順の詳細な説明

序文node.js でサーバーを作成するのは非常に簡単です。小さいながらも完全な Web サーバーを...

ドロップダウンメニューとスライドメニューのデザイン例

ドロップダウン メニューやスライド メニューを使用している Web サイトをたくさん見つけたので、私...

MySQL シリーズ 6 のユーザーと認証

目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....

純粋なCSSでは、子要素が親要素の幅制限を突破できる。

文章のスタイルでは、このような状況がよく見られます コードは次のとおりです <div styl...

Vue.js ディレクティブのカスタム命令の詳細な説明

デモコマンドをカスタマイズするVue カスタム ディレクティブの構文は次のとおりです。 Vue.di...

Vue 大画面データ表示例

効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...

Vue3におけるキーの役割と動作原理についての簡単な説明

このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...

CSS -webkit-box-orient: コンパイル後に垂直プロパティが失われる

1. 原因要件は 2 行を表示することであり、余分なテキストは 3 つのドットに置き換えられるため、...

CSS 位置プロパティが絶対の場合のパーセンテージ値の計算

位置が絶対の場合、関連する属性のパーセンテージは、参照先の要素 (包含ブロック) を基準として計算さ...

Linuxのシグナルメカニズムについての簡単な説明

目次1. シグナルリスト1.1. リアルタイム信号と非リアルタイム信号1.2 信号ステータス1.3 ...

MySQL を使用した分散ロックの実装

導入分散システムでは、分散ロックは最も基本的なツール クラスです。たとえば、支払い機能を備えた 2 ...