【问题标题】:Random high content download time in chrome?chrome中的随机高内容下载时间?
【发布时间】:2018-05-11 11:24:13
【问题描述】:

我们有一个 API,它在 chrome 中随机花费很长时间 content download,它在 Firefox 中总是可以正常工作,并且只花费很少的 ms。响应大小为 20kb 未压缩和 4kb 压缩。使用 curl 时,同样的请求也可以正常工作。

我们尝试过的事情:

  1. 禁用If-None-Match 标头以禁用来自浏览器的缓存响应。
  2. 尝试各种压缩方式(gzip、deflate、br)。
  3. 禁用压缩。
  4. 禁用所有 chrome 扩展。

相同的请求有时在 chrome 上运行良好,但会随机返回非常长的内容下载时间。

我们无法了解此问题的根本原因。我们还可以尝试尽量减少这段时间的其他事情是什么?

我在这里提出了三个请求,第三个请求花费的时间最多(在最后一个峰值之前)。 CPU 似乎没有在更长的时间内达到最大值。大部分时间都是空闲时间。

此外,当使用Replay XHR 菜单重播通话时,内容下载周期从 2 秒降至 200 毫秒。

【问题讨论】:

    标签: api google-chrome nginx api-design


    【解决方案1】:

    您是否偶然尝试实现无限滚动?如果是,请尝试拖动滚动条而不是使用鼠标滚轮。出于某种原因,Chrome 似乎在处理鼠标滚动事件。如果滚动条运行良好,请继续阅读。

    这篇文章提供了一个经历类似事情的人的详细演练 - https://github.com/TryGhost/Ghost/issues/7934

    我在scroll 事件上附加了一个观察者,它会触发一个 AJAX 请求。我已经限制了请求,可以看到只发送了 1 个。我看到我的开发服务器在几毫秒内返回响应,但 chrome 会有 2 秒的延迟。没有渲染,没有 api 调用,没有脚本执行。但是对于 14kb,“内容下载”需要 3 秒。其他浏览器都没有这个问题。

    我偶然发现使用requestAnimationFrame 而不是setTimeout 可以解决问题的建议。当“等待”或绿色很重要时,这种方法似乎有效,而不是“内容下载”或蓝色。

    经过数小时的挖掘,我尝试在 mousewheel 事件上有条件地调用 e.preventDefault(),令我惊讶的是,它成功了。

    需要注意的几点:

    1) 我没有使用mousewheel 事件来进行 api 调用。我使用了scroll 事件和限制。

    2) mousewheel 事件是非标准的,不应使用。见https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel

    3) 但在这种情况下,由于 chrome,您必须观察和处理 mousewheel 事件。如果其他浏览器不支持该事件,则它们会忽略该事件,而且我还没有看到它会导致其他浏览器出现问题。

    4) 您不想每次都调用preventDefault(),因为这会禁用鼠标滚动:) 如果您使用垂直滚动,您只想在deltaY 为1 时调用它。您可以从附图中看到deltaY 在您基本上无法滚动时为1。即使页面无法滚动,也会触发 mousewheel 事件。附带说明一下,deltaX 在垂直滚动时为 -0,deltaY 在水平滚动时为 -0。

    我的解决方案:

    window.addEventListener("mousewheel", (e) => {
        if (e.deltaY === 1) {
            e.preventDefault();
        }
    })
    

    这是我见过的唯一可行的解​​决方案,我还没有在其他地方看到它提到或讨论过。我希望这会有所帮助。

    console log of mousewheel event

    【讨论】:

    • 我相信这与 Chrome 功能 chromestatus.com/feature/5745543795965952(被动事件监听器)有关,旨在避免在监听 touchmove 等移动事件时工作 - 添加任何“鼠标滚轮”事件监听器为我解决了这个问题(即使回调是一个空函数)
    【解决方案2】:

    我认为你可能做错了。™

    从根本上说,如果这真的只发生在 Chrome 上,那么客户端代码可能是罪魁祸首,你没有透露任何细节。

    否则,您正在尝试使用前端工具调试您作为后端条件呈现的内容(基于 nginx 标签上的选择):

    • 您是否尝试过使用tcpdump(8) 来解决问题?交换哪些数据包以及在什么时间交换?

    • 您是否尝试过记录 nginx 接收和处理请求的时间?例如,$request_time?

    • 服务器位于何处?也许您遇到了丢包,这可能需要超时和重新传输某些 TCP 数据包,而这总是会引入随机延迟?

    最后,最后一种可能性是该字段并不代表您认为的那样 - 听起来它可能会受到 CPU 负载的影响,因为这是XMLHTTPRequest (XHR) 的结果处理——也许您运行一些带有用户跟踪的广告会随机消耗大量 CPU,从而减慢您的指标?

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 2016-01-19
      • 2017-08-15
      • 2015-10-04
      • 2014-06-01
      • 2012-07-06
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多