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

AxiosError: socket hang up问题:大量代理请求后系统过载的缓解咨询

解决AxiosError: socket hang up及系统过载问题

针对你遇到的请求过载导致socket hang up错误,结合你的代码和场景,可通过以下方式减轻系统负载:

1. 严格控制请求并发量

Node.js基于单线程事件循环,2000级别的并发请求会瞬间耗尽系统资源(文件句柄、内存等)。必须给请求加上并发限制,避免无节制的请求堆积:

const pLimit = require('p-limit');
// 根据服务器性能调整并发上限,建议从100开始测试
const requestLimit = pLimit(100);

server.on("connection", socket => {
  socket.on("message", async msg => {
    // 用限流函数包裹请求,确保同时处理的请求数不超过上限
    const data = await requestLimit(() => sendRequestWithProxy(msg.proxy));
    socket.send(JSON.stringify(data));
  });
});

2. 优化代理连接的复用与限制

你已经开启了keepAlive,但还需限制每个代理的最大连接数,避免单个代理占用过多资源:

const sendRequestWithProxy = async (proxy) => {
  const parsedProxy = module.exports.ParseProxy(proxy);
  const headers = {
    "Content-Type": "application/json",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0",
  };
  
  try {
    const res = await axios.get("https://www.google.com", {
      headers,
      httpsAgent: new HttpsProxyAgent(parsedProxy, { 
        keepAlive: true,
        maxSockets: 50, // 限制每个代理的最大活跃连接数
        keepAliveMsecs: 30000 // 长连接空闲超时时间
      }),
      httpAgent: new HttpProxyAgent(parsedProxy, { 
        keepAlive: true,
        maxSockets: 50
      }),
      timeout: 10000 // 合理设置超时,避免请求长时间阻塞
    });
    return res.data;
  } catch (e) {
    console.error(`代理${proxy}请求失败: ${e.message}`);
    return false;
  }
};

3. 降低Python端的线程数

2000个Python线程已经远超常规系统的承载能力,线程切换开销和资源占用会直接拖垮整个服务:

  • 将线程数降至200-500区间测试
  • 改用异步IO框架(如aiohttp)替代多线程,大幅减少资源占用

4. 清理无效资源与监控

  • 定期检查系统打开的socket连接数:用lsof -i命令查看,确认是否存在未释放的连接
  • 移除无用的事件监听器:当socket断开时,调用socket.off("message")避免内存泄漏
  • 监控系统指标:通过top/htop跟踪CPU、内存占用,通过cat /proc/sys/fs/file-max确认文件句柄上限是否足够

5. 实现熔断机制

当请求失败率达到阈值时,暂时停止发送请求,避免系统雪崩:

let failCount = 0;
const FAIL_THRESHOLD = 50;
const COOLDOWN_TIME = 60000; // 冷却1分钟

const sendRequestWithProxy = async (proxy) => {
  if (failCount >= FAIL_THRESHOLD) {
    await new Promise(resolve => setTimeout(resolve, COOLDOWN_TIME));
    failCount = 0;
  }
  
  try {
    // ...原有请求逻辑...
    failCount = 0; // 成功请求重置失败计数
    return res.data;
  } catch (e) {
    failCount++;
    // ...错误处理...
    return false;
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:02:41