You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行loadtest测试Node.js集群服务器时出现node:events:491错误

Node.js集群服务执行loadtest时触发ENOTCONN错误

我跟着视频教程运行一个模拟服务器流量的Node.js示例应用,执行指令loadtest -n 300 http://localhost:3000时触发了错误。

我的代码:

const numCpus = require("os").cpus().length
const cluster = require("cluster");
const { createServer } = require("http");


if (cluster.isMaster) {
    console.log(`This is the master process`, process.pid);
    for(let i = 0; i < numCpus; i++ ) {
        cluster.fork();
    }
    
}
else {
    createServer((req,res) => {
        const message = `worker process ${process.pid}`
        console.log(message);
        res.end(message)
    }).listen(3000)
}

错误信息:

node:events:491
      throw er; // Unhandled 'error' event
      ^

Error: read ENOTCONN
    at tryReadStart (node:net:674:20)
    at Socket._read (node:net:685:5)
    at Readable.read (node:internal/streams/readable:496:12)
    at Socket.read (node:net:741:39)
    at resume_ (node:internal/streams/readable:999:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
Emitted 'error' event on WriteStream instance at:
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -4053,
  code: 'ENOTCONN',
  syscall: 'read'
}

解决方法

1. 给worker服务器添加错误监听

这个错误本质是未捕获的socket读取异常,给每个worker的HTTP服务器实例加上错误监听,就能避免进程直接崩溃:

修改worker部分代码:

else {
    const server = createServer((req,res) => {
        const message = `worker process ${process.pid}`
        console.log(message);
        res.end(message)
    });

    // 添加错误监听
    server.on('error', (err) => {
        console.error(`Worker ${process.pid} 出错:`, err.message);
    });

    server.listen(3000);
}

2. 给master进程加上worker重启机制

如果worker进程意外退出,master进程可以自动重启它,保证服务不会因为个别worker挂掉而无法响应:

修改master部分代码:

if (cluster.isMaster) {
    console.log(`This is the master process`, process.pid);
    for(let i = 0; i < numCpus; i++ ) {
        cluster.fork();
    }

    // 监听worker退出事件,自动重启
    cluster.on('exit', (worker) => {
        console.log(`Worker ${worker.process.pid} 已退出,正在重启...`);
        cluster.fork();
    });
}

3. 调整loadtest的并发参数

有时候高并发请求会触发这类socket异常,可以限制并发连接数来测试:

loadtest -n 300 -c 10 http://localhost:3000

ENOTCONN错误表示尝试从未连接的socket读取数据,在集群模式的高并发场景下偶尔出现属于正常的连接竞态问题,加上错误监听和worker重启机制后,就能保证服务的稳定性。

内容的提问来源于stack exchange,提问作者rtp_46

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:10:22