So it's an incendiary title; "Chrome...breaks HTTP/2 priorities!". The effect is real, the cause is misattributed.
So browsers read stream sof bytes coming in and try to locate things that will correspond to network resources and request them early. This is happening in the critical path of page load without full information about the resulting DOM, CSS OM, or even what's in the viewport.
-
-
Because networks aren't perfectly fast, outbound requests go into a queue. The way Chrome prioritizes those requests is based on a bunch of heuristics. Did it come from a blocking script? High priority! XHR? Low priority. Etc., etc.
Show this thread -
Remember: HTML doesn't actually define a priority system, so this is all an exercise to the implementer and browsers do simulated annealing to come to roughly-good heuristics (historically, based on bogus benchmarks, but we're doing better now; thanks for asking).
Show this thread -
So browsers are trying to keep the pipe full. Wasted time in the critical path is wasted time. There's no other word for it. Being slightly wrong about priority is much worse than not issuing a network request with the channel would otherwise be empty.
Show this thread -
Let that really sink in: the browser-side idea of priority is a decision made with incomplete information, under the gun, and once the request is sent, it's pretty much over-and-done with.
Show this thread -
Contrast that with the baroque-AF priority system that the H/2 WG cooked up at the last minute: https://http2.github.io/http2-spec/#pri-depend … Earlier drafts used integer priorities (in a small range, IIRC). The final version, in contrast, assumes the client knows a LOT about outbound requests.
Show this thread -
So you've got a server with lots of time (until it gets a flood of requests to handle), assuming a client that has full knowledge of the dependency graph...which as we've just discussed, is basically never the case.
Show this thread -
Getting more information to construct a more accurate dependency graph would require more processing (and waiting) on the client side before issuing requests...which is dead air...which is bad. So client's don't actually wait. They take their initial guess about priority and run.
Show this thread -
"But", I hear you saying, "the client can adjust priorities!": https://http2.github.io/http2-spec/#reprioritize … LAWLZ.
Show this thread -
In practice, inbound requests dish off to some other thread. That work is likely I/O bound. That I/O, once started, isn't worth pausing or changing. You're better off getting the bytes into memory to be flushed ASAP with as little second guessing as possible.
Show this thread -
High-performance H/2 servers will pretty much always drop subsequent PRIORITY frames on the floor and high-performance clients won't wait to generate them. H/2 priorities are a practical joke as far as I can tell. I presume
@mnot is getting the last laugh.Show this thread -
So what's happening in
@EWErikWitt's post is a cruel combination: 1.) HTML has serially failed to define a meaningful priority scheme (yes, I'm grumpy about it) 2.) H/2 priorities aren't passed because it's "magic" info as a result 3.) fetch() is in the XHR slow bucket
Show this thread -
's post should be titled "Service Workers show how broken HTML and H/2 priorities are". We can do some magic in the limited case he outlines where the source `Request` hasn't been touched, but honestly, we shouldn't.
Show this thread -
Instead, we should be exposing a real, integer-range-based, priority system. No, browsers won't magically agree on these weights. Yes, network stack will sometimes need to reorder anyway, but how is that worse than the status quo?
Show this thread -
The infuriating part of this is the condescension from the H/2 and network stack community. The fear that web developers will "just make everything high priority; then what?" is both real, true, and useless.
Show this thread -
We'll always need to intervene as the user's agent, but so long as JS is part of the platform, developers could *already* do whatevs; it might just have been the long way 'round.
Show this thread -
So it's worth flagging this effect, worth being upset, and perhaps even worth calling out all the folks who work on Chrome that haven't fixed it. But the problem isn't the implementation. It's harder and worse than that. It's a fundamental lack of respect for web developers.
Show this thread -
Taking control of the network shouldn't mean always getting down-ranked in priority. This sort of magic needs to be in developer hands: https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc?l=124 …
Show this thread
End of conversation
New conversation -
Loading seems to be taking a while.
Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.
& Web Standards TL; Blink API OWNER
Named PWAs w/
DMs open. Tweets my own; press@google.com for official comms.