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

运行Node.js负载测试脚本致MacOS Catalina冻结崩溃问题咨询

问题根本原因
  • 代码逻辑存在资源泄漏:fetch 方法的返回值res仅代表响应头接收完成,你没有显式消费或丢弃响应体,导致每个请求对应的TCP连接会一直持有等待数据读取,不会释放也不会复用。你提到的“依赖垃圾回收清理”是无效的,这些网络连接属于操作系统内核管控的资源,不受JS垃圾回收直接调度,GC触发前连接会一直驻留,短时间内会累计数百个未释放的TCP连接。
  • macOS 10.15.7 存在内核网络栈缺陷:该版本对未读取数据的TCP连接回收效率极低,大量未释放的网络连接会迅速耗尽系统全局的socket缓冲区、可用端口资源,内核网络处理线程被完全阻塞,后续所有应用的网络请求都无法处理,最终触发用户态核心服务(WindowServer、logd)超时,触发kernel panic。这也符合你观测到的CPU、内存占用低但网络活动满负荷的现象。
解决方案
    1. 修复fetch逻辑,主动释放连接资源:每次请求后主动销毁响应对象,哪怕不需要返回数据,也要显式告知底层连接可以释放。修改后的fetchAll函数示例:
async function fetchAll(url) {
    const res = await fetch(url, {
        method: 'GET'
    });
    // 主动销毁响应,释放TCP连接资源
    res.destroy();
    if (!res.ok) {
        throw new Error(res.statusText);
    }
}
    1. 配置连接池限制并发数:给node-fetch配置统一的HTTP/HTTPS Agent,开启连接复用,限制全局最大并发连接数,避免短时间产生过多连接占用系统资源,示例配置:
const http = require('http');
const https = require('https');
const fetch = require('node-fetch');

// 配置全局连接池,最大并行连接数可根据实际情况调整
const httpAgent = new http.Agent({ keepAlive: true, maxSockets: 10 });
const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 10 });

async function fetchAll(url) {
    const res = await fetch(url, {
        method: 'GET',
        // 根据请求协议选择对应agent
        agent: url.startsWith('https') ? httpsAgent : httpAgent
    });
    res.destroy();
    if (!res.ok) {
        throw new Error(res.statusText);
    }
}
    1. 升级操作系统:macOS 11(Big Sur)及以上版本修复了该场景下的内核网络栈资源泄漏问题,不会再因为单个应用的网络连接占用触发全局系统崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:18:02