リクエストをラウンドロビン方式で 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: {
// ...
},
};