运行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
相关产品推荐
相关产品推荐

