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

