在 Mac OS 上挂起连接

Hanging connections on Mac OS

在我的服务器上请求资源时,Mac OS 出现网络问题(问题不是一直存在)。但是,我可以通过使用 JavaScript 按顺序 请求随机资源 1000 次 .

来重现该问题
var req = (id) => fetch('https://www.example.com/my/resource/starter.js?' + id);

// use the 'limit' as identifier
var doRecursiveRequest = (limit) => 
  req(limit).then(res => {
    if (--limit) {
      return doRecursiveRequest(limit);
    }
});

doRecursiveRequest(1000);

在网络选项卡中,我看到资源加载速度非常快。请求计数器计数非常快,突然停止。之后大约需要 30 秒,直到再次停止(总是在几百次请求之后)。一段时间后,所有请求将成功完成。

通过使用 Google Devtools(性能选项卡),我可以看出问题所在,但我不明白原因。

在某些时候,有 6 个并行网络任务 运行(全部由我的 JavaScript 执行)。似乎 Chrome 最多允许 6 个这样的并行微任务。之后最多需要 30 秒,直到一个 "killed" (?!) 并允许下一个开始。但是,在服务器端,响应时间都非常快(所有 1000 个请求都已到达服务器并已发送响应)。

附加信息:

事实证明,带有 Keep-Alive Header 的 HTTP 响应导致了问题。禁用 keep alive 机制并添加 Content-Length Header 后,问题不再重现。

这似乎是一个已知问题,请参阅 https://whosebug.com/a/25996971/9816335