NodeJS にリクエストを送信するときに、リクエストがドロップされるのはなぜですか?

NodeJS にリクエストを送信するときに、リクエストがドロップされるのはなぜですか?

リクエストをラウンドロビン方式で 4 台のサーバーに負荷分散する AWS ALB があります。

各サーバーは pm2 を使用して、これらの要求を 6 つの CPU にラウンドロビンします。

NodeJS プロセス (React NextJS) は、Express.js によって提供される 6 つの CPU のそれぞれで実行されています。最初に行うことの 1 つは、受信リクエストをログに記録することです (Apache や nginx などの Web サーバーが前面になく、Express.js に直接送信されます)。

通常、ALB にヒットするすべてのリクエストは正常に転送され、NodeJS プロセスによってログに記録されます。ただし、トラフィックが多いときには、一部のリクエストがドロップされ、NodeJS プロセスに到達しないことがあります。当然、これらの失敗はサーバー ログに記録されません。そもそも、これらの失敗は NodeJS プロセスに到達しないからです。このギャップは、ALB リクエスト数と比較することによってのみ確認できます。

ドロップされる原因となるメカニズムを理解しようとしています。NodeJS の内部キューがタイムアウトしているのでしょうか。それとも Linux カーネルの問題でしょうか。トラフィックが多い期間中、一部の CPU がビジー状態になり、他の CPU がアイドル状態になる兆候が見られます。これは、キューの長さ (キングマンの公式、リトルの法則など) を思い起こさせます。サーバーの容量を増やす、応答時間を短縮する、サーバーレベルの負荷分散戦略を変更するなど、これが発生する可能性を減らす方法はいくつか考えられますが、私はむしろ、リクエストが実際にどこでスタックし、ドロップ/消失するかどうか、またその方法を決定するものは何かを理解しようとしています。特に、ログに記録したり、発生時に何らかの信号を送信したりできる場合はなおさらです。

pm2 設定のスニペット:

module.exports = {
  apps: [
    {
      name: 'community',
      script: 'dist/server.js',
      instances: -1,
      exec_mode: 'cluster',
      autorestart: true,
      watch: false,
      log_date_format: 'YYYY-MM-DD HH:mm Z',
      max_memory_restart: '2G',
// ...
// and env-specific configs, such as
      env_production: {
        NODE_ENV: 'production',
        NODE_OPTIONS: '--max-old-space-size=3584 --max-http-header-size=16380',
        LOG_LEVEL: 'INFO',
        PORT: 3000,
      },
    },
  ],
  deploy: {
// ...
  },
};

関連情報