我有一个 AWS ALB,它可以将负载平衡请求循环发送到四台服务器。
每个服务器使用 pm2 将这些请求循环分发给六个 CPU。
NodeJS 进程(react NextJS)在 Express.js 提供的六个 CPU 上运行。它们所做的第一件事就是记录传入的请求。(它们不是由 apache 或 nginx 等 Web 服务器负责,而是直接转到 Express.js。)
通常,到达 ALB 的每个请求都会成功转发,并由 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: {
// ...
},
};