【问题标题】:Hanging connections on Mac OSMac OS 上的挂起连接
【发布时间】:2019-09-11 16:18:41
【问题描述】:

在我的服务器上请求资源时,我遇到了 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 秒才能“杀死”一个(?!),然后允许下一个开始。但是,在服务器端,响应时间都非常快(所有 1000 个请求都已到达服务器并发送了响应)。

附加信息:

  • 我只在 Mac OS(Google Chrome、Safari 和 Firefox)上遇到这个问题
  • 在 Windows 10 上,它按预期工作;没有待处理的请求(来自服务器的响应时间除外)
  • 打印屏幕来自 Windows 机器,但记录的 chrome-dev 配置文件在 Mac OS 上
  • 系统详细信息:MacBook Pro / OS X El Capitan(版本 10.11.6)/Google Chrome 76.0.3809.132(64 位)

【问题讨论】:

  • 听起来像是浏览器或操作系统中的错误/怪癖。您可以切换到 XMLHttpRequest 并指定timeout
  • @wOxxOm 不幸的是,它并没有改变什么。类似的行为。

标签: javascript macos google-chrome networking google-chrome-devtools


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2017-05-21
    • 2018-11-26
    • 2021-09-05
    • 2011-03-12
    • 2011-01-19
    相关资源
    最近更新 更多