【问题标题】:Is there a way to debug why a chrome request was queued?有没有办法调试 chrome 请求排队的原因?
【发布时间】:2021-09-15 23:04:59
【问题描述】:

背景:Chrome 有一个请求队列。在某些情况下,它将对可延迟的请求进行排队。但我发现很难确定哪些请求导致请求排队。

我的问题是:我们有办法深入研究排队问题的根本原因吗?

source code

chrome doc

【问题讨论】:

  • 看起来该代码是由浏览器进程处理的网络堆栈的一部分。为什么不设置断点,开始调试浏览器进程找出来呢?
  • 好吧,假设user docs are accurate,看起来你真的有两个主要案例需要探索1)更高优先级的请求和2)来自同一来源的请求数量(仅适用于http 1/1.1上限为 6)。提到的第三种情况涉及分配磁盘,所以我会最后看一下。我猜你的问题是 #2,因为它很容易启动超过 6 个请求。
  • 最大并行请求是最可能的原因。请参阅此处了解跨越数年的好答案:stackoverflow.com/questions/985431/…This page
  • 问题来自@z-better 但赏金来自@brad?不知道这是可能的。无论如何,我的答案就在那里:-)
  • @LMC 是的,如果你不能把它们花在什么东西上,那么假的互联网积分有什么用? :-) 我经常为其他人的问题添加赏金,尤其是如果它与我正在做的事情远程相关。

标签: google-chrome networking chromium request-queueing


【解决方案1】:

Chrome 可能是queuing a request(与任何其他浏览器一样)有几个原因

排队。浏览器在以下情况下对请求进行排队:

  • 有更高优先级的请求。
  • 已经为此源打开了六个 TCP 连接,这是限制。仅适用于 HTTP/1.0 和 HTTP/1.1。
  • 浏览器正在磁盘缓存中短暂分配空间

在开发者工具的网络选项卡中,使用Save all as HAR with content 保存请求并分析每个请求的timings 对象

    "timings": {
      "blocked": 2.0329999979403803,
      "dns": -1,
      "ssl": -1,
      "connect": -1,
      "send": 0.397,
      "wait": 189.6199999998943,
      "receive": 296.10200000024633,
      "_blocked_queueing": 1.1759999979403801
    }

HAR 可以用jq 过滤,例如查找带有_blocked_queueing > 50的条目

jq -r '.log.entries | to_entries[] | if(.value.timings._blocked_queueing > 50) then [.key, .value.request.url, .value.timings._blocked_queueing,.value.timings.blocked ] else empty end' stackoverflow.com.har

结果:

[
  21,
  "https://graph.facebook.com/4191055284264423/picture?type=large",
  160.28299999743467,
  160.66799999743466
]
[
  66,
  "https://fonts.gstatic.com/s/robotoslab/v13/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjojISmb2Rm.ttf",
  55.99899999651825,
  109.53999999651825
]
[
  67,
  "https://fonts.gstatic.com/s/robotoslab/v13/BngbUXZYTXPIvIBgJJSb6s3BzlRRfKOFbvjoa4Omb2Rm.ttf",
  56.85599999560509,
  56.85599999560509
]

然后我们可以检查其中一个请求的 6 个先前条目

jq -r --argjson idx 67 '.log.entries[($idx - 6):($idx + 1)] | .[] | [.request.url, .time, .timings]' stackoverflow.com.har

或获取最高的dns

jq -r '.log.entries | sort_by(.timings.dns|floor)[-1] | .timings.dns, .request.url' stackoverflow.com.har 
438.551
https://example.com

Here's my analysis 的 TTFB 计时使用 Wireshark,这可以作为调试工作的补充。

Google 提供了一个online HAR Analyzer,可用于类似于开发工具网络窗格。

将鼠标悬停在Waterfall 列上的请求上,可以看到请求的详细信息。作为第一种方法,长排队请求之前可以有一个或多个对任何项目具有高值的请求。

使用下面的命令行获取一个csv,然后用它制作图表

  • 日期为 Unix 时间戳 [ms]
  • 请求时间 [毫秒]
  • _blocked_queueing [毫秒]
jq -r '.log.entries | to_entries[] | [.value.startedDateTime, .value.serverIPAddress, .key, ((.value.startedDateTime[0:19] + "Z"|fromdateiso8601)*1000 + (.value.startedDateTime[20:23]|tonumber)), .value.time, .value.timings._blocked_queueing ] | @csv' stackoverflow.com.har | tee stackoverflow.com.har.csv

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2020-10-20
    • 1970-01-01
    • 2020-12-18
    • 2014-05-20
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多