在Mac OS上挂起连接

时间:2019-09-11 16:18:41

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

在我的服务器上请求资源时,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个请求都已到达服务器并发送了响应)。

enter image description here enter image description here enter image description here enter image description here

其他信息:

  • 我仅在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位)

1 个答案:

答案 0 :(得分:0)

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

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