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

Node.js应用高并发请求后崩溃,报connect EADDRNOTAVAIL错误求助

解决Node.js服务因高并发请求导致EADDRNOTAVAIL崩溃的问题

问题分析

你遇到的EADDRNOTAVAIL错误,本质是本地端口资源耗尽了。你每5秒发起10000个请求,每个HTTP请求都会占用一个本地临时端口(默认系统临时端口范围一般是32768-65535,总共约3万个),但请求结束后端口不会立刻释放,会进入TIME_WAIT状态(默认Linux下是60秒)。短时间内的海量请求会把所有可用端口占满,新请求找不到可用端口就会抛出这个错误。另外,错误栈里的Unhandled 'error' event也说明你的请求代码没处理错误事件,一旦出问题就会直接导致进程崩溃。

具体解决方案

下面给你分场景整理了实用的解决办法:

1. 代码层面:复用HTTP连接,减少端口占用

Node.js的http.get()默认每次请求都会新建连接,你可以用Agent来复用连接,大幅降低端口消耗:

const http = require('http');
// 配置连接复用的Agent,maxSockets根据服务器承载能力调整
const agent = new http.Agent({ keepAlive: true, maxSockets: 100 });

function makeRequest() {
  http.get({
    hostname: 'localhost',
    port: 8000,
    agent: agent // 指定复用连接的Agent
  }, (res) => {
    // 记得消费响应数据,避免内存泄漏
    res.resume();
    res.on('end', () => {});
  }).on('error', (err) => {
    // 必须处理错误,防止未捕获异常崩进程
    console.error('请求出错:', err.message);
  });
}

// 调整请求发起节奏,不要瞬间打满端口
setInterval(() => {
  // 分批次发起请求,比如每次发100个,间隔100ms
  for (let i = 0; i < 100; i++) {
    setTimeout(() => makeRequest(), i * 100);
  }
}, 5000);

2. 系统层面:调整TCP参数(Linux/macOS)

如果必须维持高并发请求频率,可以修改系统TCP参数来缓解端口压力:

  • 临时生效(重启后失效):
# 缩短TIME_WAIT状态的超时时间
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# 允许复用处于TIME_WAIT状态的端口
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# 扩大临时端口范围
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  • 永久生效:编辑/etc/sysctl.conf,添加上述配置,执行sudo sysctl -p让配置生效。

3. 服务器端:优化服务承载能力

你的Node.js服务本身也可能因为处理不过来大量请求导致资源耗尽,建议:

  • 给HTTP服务器设置合理的最大连接数:
const server = http.createServer((req, res) => {
  res.end('OK');
});
server.maxConnections = 1000; // 根据服务器硬件配置调整
server.listen(8000);
  • 避免在请求处理中使用同步阻塞操作,尽量用异步IO,防止事件循环被卡住。
  • 给请求添加超时处理,避免挂起的请求长期占用资源。

4. 必做:给请求添加错误监听

之前的崩溃很大一部分原因是未处理请求的error事件,一定要给每个http.get()调用绑定error事件监听,就像上面代码里那样,这样即使个别请求出错,也不会导致整个进程崩溃。

总结

先从复用HTTP连接和添加错误处理入手,这两个是代码层面最容易实现的优化;如果还是需要更高的并发,再调整系统参数。另外,压测时尽量模拟真实场景,不要瞬间发起远超系统承载能力的请求,这样的测试结果也更有参考性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:27:08