Nodejs パフォーマンスのヒント

Nodejs パフォーマンスのヒント。

Node.js はデフォルトでいくつのスレッドを使用しますか

一般的な Node.js プロセスでは、使用されるスレッドの内訳は次のとおりです:

  • メイン スレッド: これは、Node.js イベント ループを実行し、JavaScript コードを実行する単一のスレッドです。

  • Libuv スレッド プール: デフォルトでは、libuv は 4 つのスレッドを持つスレッド プールを作成します。これらのスレッドは、ファイル システム タスクや DNS ルックアップなどの非同期 I/O 操作の処理に使用されます。

  • V8 エンジン スレッド: Node.js は V8 JavaScript エンジンを使用します。このエンジン自体も追加のスレッドを使用します。通常、ガベージ コレクションやコード最適化などのタスクには、V8 によって 2 つのスレッドが使用されます。

libuv スレッド プールのスレッド数を増やす方法

libuv を使用して Node.js のスレッド プール サイズを増やすには、UV_THREADPOOL_SIZE 環境変数を設定します:

UV_THREADPOOL_SIZE=64 node app.js
  • UV_THREADPOOL_SIZE の最大値は 1024 です。I/O バウンド タスクのパフォーマンスを最適化するには、通常、論理コアの数に設定することをお勧めします。正当な理由なく高く設定しすぎると、オーバーヘッドが増加し、非効率になる可能性があります。

  • クラスター設定では、各ワーカー プロセスに独自のスレッド プールがあり、スレッド プールのスレッドの合計数は UV_THREADPOOL_SIZE * numberOfWorkers になります。

  • CPU バウンド タスクの場合、UV_THREADPOOL_SIZE を増やしても大きなメリットが得られず、リソースの競合につながる可能性があります。代わりに、cluster または worker_threads モジュールを活用します。

メモリ パフォーマンスを調整または改善する方法

--expose-gc オプションを活用する

  • Node.js の --expose-gc フラグは、ガベージ コレクション (GC) 関数を公開するために使用され、手動でガベージ コレクションをトリガーできます。
node --expose-gc app.js

# コードで global.gc() を呼び出してガベージ コレクションを要求します
  • ガベージ コレクションを手動でトリガーすると、GC 中に他のすべての操作が停止するため、アプリケーションの実行が一時停止される可能性があります。過度に使用すると、パフォーマンスに影響する可能性があります。これは、メリットがある特定の場合にのみ、控えめに使用する必要があります。

--max-old-space-size の値を調整する

  • Node.js の --max-old-space-size フラグは、V8 エンジンの古い世代のヒープ (長寿命オブジェクトが格納される場所) の最大メモリ サイズを設定するために使用されます。

  • --max-old-space-size の値は、使用可能なシステム メモリとアプリケーションの特定のニーズに基づいて決定する必要があります。たとえば、サーバーの RAM が 8 GB の場合、他のプロセス用のスペースを残してスワップを回避するために、フラグを 6 GB に設定します。

node --max-old-space-size=6144 app.js

# 次のように環境変数で設定することもできます:
export NODE_OPTIONS="--max-old-space-size=6144"

nodejs