- From: 陈智昌 <willchan@chromium.org>
- Date: Tue, 15 Jul 2014 17:29:48 -0700
- To: Peter Lepeska <bizzbyster@gmail.com>
- Cc: Ilya Grigorik <igrigorik@google.com>, "Nottingham, Mark" <mnotting@akamai.com>, "Podjarny, Guy" <gpodjarn@akamai.com>, public-web-perf <public-web-perf@w3.org>
- Message-ID: <CAA4WUYhO0p1iDNM+PAo+_ttCQBTe7gRyViBzxzcjSfb6oXmW6Q@mail.gmail.com>
On Tue, Jul 15, 2014 at 1:22 PM, <bizzbyster@gmail.com> wrote:
> Comments inline…
>
> On Jul 15, 2014, at 1:07 PM, William Chan (陈智昌) <willchan@chromium.org>
> wrote:
>
> On Tue, Jul 15, 2014 at 9:55 AM, <bizzbyster@gmail.com> wrote:
>
>> "
>>>
>>>
>>> - In order to make optimal use of a connection pool, it's valuable
>>> to know the size of a resource ahead of time. Is it possible to include an
>>> expected-size attribute?
>>>
>>> *If* we were to consider introducing this, I don't think its limited to
>> hints. As such, I think this is a separate discussion. "
>>
>> I think expected size is also important because it allows the UA to make
>> an informed decision about whether or not it wants to incur the possible
>> cost of preloading. For instance, if the UA detects that the network is
>> severely bandwidth constrained, it might decide to not issue preload
>> requests for very large objects due to the possibility that the resource
>> may never be requested. For instance, if the user clicks off the page
>> before it is fully loaded.
>>
>
> Can you illustrate with more examples? If the user clicks off the page
> before it is fully loaded, then the rendering engine cancels the resource
> requests, which will cancel the HTTP fetch. This takes a roundtrip to get
> origin servers not to send any more data.
>
>
> Yes. Look at this page:
> http://caffeinatetheweb.com/with_hints.html?max=100. The page consists of
> 100 prefetchable javascript files and 100 unprefetchable image files. It is
> constructed in such a way that each javascript/image pair is requested
> serially. After all of those are requested the page requests a large (~600
> KB) image file. Over a dialup connection, the 80% visible time for the page
> would be faster if the browser decided NOT to prefetch the large image
> file. Does that make sense?
>
Got it. Just to be clear, this is a completely different example than your
former case, since the former involved clicking off the page, whereas this
one involves bandwidth contention from resources on the same page. Is there
a reason we don't solve this case with flow control (TCP or HTTP/2)? Let
the flow control window shrink to 0 so the sender stops hogging the
bandwidth.
>
>> Similar to the argument Ilya made about the UA being in the best position
>> to decide the number of pre-connects for a given host, though I don't think
>> that is strictly true for pre-connects, it is surely in the best position
>> to decide whether or not the potential cost of prefetching outweighs the
>> benefit due to last mile bandwidth limitations. And "expected size" gives
>> the UA the information needed to make this determination.
>>
>
> Can you explain why bandwidth contention is better solved with clients
> holding back large requests rather than holding back low priority requests?
> jQuery is large, but we download it anyway because it's critical to
> rendering.
>
>
> I agree with you that priority is key. Unfortunately right now resource
> hint priority is completely based on the type of the object. This doesn't
> take into consideration size or where the object is on the page. For
> instance, as in this case, the large image is only visible after scrolling
> all the way to the bottom of the page and so it should have a lower
> priority than an identical image that is rendered at the top of the page.
>
I agree that priority is suboptimal. We should/are fixing that (we demote
priority for images below the viewport once we know what is actually in the
viewport, i.e. we layout the page). You give a good example of how priority
can be broken. But how does expected-size do better in your example?
>
>
>
>>
>> Ilya,
>>
>> Where do you think it's best to have this discussion? I think it's really
>> important.
>>
>> Thanks,
>>
>> Peter
>>
>> On Jul 10, 2014, at 5:41 PM, Ilya Grigorik <igrigorik@google.com> wrote:
>>
>> Peter, Guy, Mark, thanks for the feedback! Comments inline.
>>
>> On Tue, Jul 8, 2014 at 8:08 PM, Nottingham, Mark <mnotting@akamai.com>
>> wrote:
>>>
>>> 2) The "Caching Grace Period" section seems a bit iffy to me... I
>>> wouldn't express this as being an override of the caching policy, but
>>> rather of it being applied *after* the cache; i.e. the rendering engine
>>> itself effectively caches it for next use.
>>>
>>
>> Yep, great point. Will suggested the same and I've took a run at
>> reworking that section. Let me know how this looks:
>> https://github.com/igrigorik/resource-hints/issues/5
>>
>>
>> On Thu, Jul 10, 2014 at 7:27 AM, <bizzbyster@gmail.com> wrote:
>>>
>>> On Jul 9, 2014, at 9:20 AM, "Podjarny, Guy" <gpodjarn@akamai.com> wrote:
>>>
>>> Section 2.1 (preconnect):
>>>
>>> - One delta between pre connect and dns-prefetch is cost to the UA.
>>> My understanding is that establishing a connection is more expensive in
>>> resource utilization than DNS prefetch too. Therefore, dns-prefetch may be
>>> used more lightly, and perhaps it’s a reason to not think of dns-prefetch
>>> as a preconnect.
>>>
>>> Fair enough. That said, I think this is something worth experimenting
>> with.. All modern browsers are already doing preconnects anyway (without
>> the hint and based on own heuristics), so I'm not sure that the
>> dns-prefetch upgrade would change the picture by much. I'll see if I can
>> get some data from HTTP Archive on how often dns-prefetch is used in the
>> wild.
>>
>>>
>>> - For some domains (e.g. Your CDN domain), it’ll actually be helpful
>>> to open multiple connections, not just one (assuming no SPDY/HTTP2).
>>> Specifying a number sounds too wrong, but does it make sense to put a
>>> weight factor on the preconnect? Maybe a “primary” vs “secondary” domain?
>>> Could be getting into the diminishing returns space.
>>>
>>> I agree that it is helpful to open multiple connections for many domains
>>> but don't see a problem with specifying a number. The draft argues that the
>>> UA is "is in the best position to determine the optimal number" of
>>> connections per domain. But this is not always the case. If the server were
>>> able to receive and leverage feedback from browsers ("past request
>>> patterns" in the draft) then it could know more about the capabilities of
>>> various domains. For instance, we see some servers allow a large number of
>>> concurrent connections and others enforce strict low limits. I think it
>>> makes sense to include a suggested number of connections in the pre-connect
>>> hint. The UA is free to ignore that suggestion.
>>>
>>
>> I understand the motivation, but I still think this exposes knobs that
>> should be left to the user agent. The number of connections will vary by
>> users connection type, time of day, protocol, and so on, all of which are
>> dynamic. Browsers already track this kind of information and adapt their
>> logic to take this into account - e.g. chrome://dns/ (see "Expected
>> Connects" column). With HTTP/2 this is also unnecessary (and I say that
>> with awareness of your recent thread on http-wg on the subject :)).
>>
>>> Section 2.2 (preload):
>>>
>>> - With today’s implementations, double downloading of preloaded
>>> resources is a major issue. Would be good to make some explicit definitions
>>> about how to handle a resource that has been requested as a preload
>>> resource already and is now seen on the page. An obvious rule should be to
>>> not double download, but others may be more complex (e.g. What if we
>>> communicated a low prio via SPDY/HTTP2?)
>>>
>>> - Matching retained responses with requests:
>> https://igrigorik.github.io/resource-hints/#matching-request
>> - (Re)prioritization:
>> https://github.com/igrigorik/resource-hints/issues/1
>>
>>>
>>> - Content type as text sounds a bit error prone. Would
>>> “text/javascript” cover “x-application/javascript” too? Is there a way to
>>> normalize content types?
>>>
>>> Jake proposed using "context" instead, which I really like, but need to
>> do some more digging on:
>> https://github.com/igrigorik/resource-hints/issues/6
>>
>>>
>>> - Should preload resources delay unload? (my vote is no)
>>>
>>> Preload hints are for the *current* page. As a result they are cancelled
>> as part of onunload. If you need the request to span across navigations,
>> you should be using prefetch, which is used to load resources for next
>> navigation.
>>
>>>
>>> - What should preload (and prefetch) do in case the resource request
>>> got a temp error (e.g. 502)
>>> - How should the UA handle cookies set in a response to a preload
>>> (or prefetch)?
>>>
>>> Hint-initiated requests are not special in any way: think of any request
>> initiated by the preload scanner today, all the same behaviors here. If the
>> request fails, it fails.. it sends the same cookies, and so on.
>>
>>
>>> A few more to add to this list:
>>>
>>> - How to handle the fact that cookies may have changed between the
>>> requesting of the preload resource and the requesting of the resource by
>>> the renderer either due to a Set-Cookie or a locally executed javascript?
>>> Perhaps we could add an attribute that indicates that the resource is
>>> cookie-sensitive or not?
>>>
>>> We don't. You have the same race condition today with the preload
>> scanner sending early fetches for JS/CSS.
>>
>>>
>>> - The earlier spec discussed preload hints URLs that were generated
>>> via javascript. I think this is very powerful as it allows the browser to
>>> preload dynamically generated URLs. For instance, URLs with sessionID or
>>> Date or rand appended to them.
>>>
>>> Yes, this is what preconnect covers. We don't know the URL, but if we
>> know the origin we can at least complete the handshake:
>> https://igrigorik.github.io/resource-hints/#preconnect (example 1)
>>
>>>
>>> - By viewing past behavior, especially with resource priorities in
>>> HTTP/2, the server can actually know quite a bit more than the browser
>>> about resource priorities. It would be great if the server could provide
>>> the UA with a hint as to the importance of the object. Is it a serializing
>>> resource? Does visual completeness depend on it? This information could be
>>> communicated via a simple low, medium, high type scheme and the spec could
>>> provide description as to what these values mean.
>>>
>>> That's what type/context is meant to provide. Today we don't have a more
>> fine grained mechanism to communicate priorities. Perhaps we should, but I
>> think that's a separate discussion.
>>
>>>
>>> - In order to make optimal use of a connection pool, it's valuable
>>> to know the size of a resource ahead of time. Is it possible to include an
>>> expected-size attribute?
>>>
>>> *If* we were to consider introducing this, I don't think its limited to
>> hints. As such, I think this is a separate discussion.
>>
>>>
>>> - As per our other email thread, we should include object version
>>> information in the preload hint so as to minimize cache re-validation
>>> requests.
>>>
>>> I still think that subresource integrity is the right place to discuss
>> this: http://www.w3.org/TR/SRI/#caching-optional-1
>>
>>> Section 3.4 (Caching grace period):
>>>
>>> - Since these hints are explicitly added, I think we can be a bit
>>> more strict in what we require.
>>> - My vote would be:
>>> - For preload, do the same thing the preparser does, which I
>>> believe means use the resource regardless of whether it’s cacheable, as
>>> long as you’re in the midst of loading the current page (may require some
>>> definition of when has the page finished loading, which I suspect the
>>> preloader deals with too). If you go to another page, revert to the cache
>>> instructions on the resource.
>>>
>>> +1
>>>
>>
>> Yes, this should be covered by the new "matching requests" section.
>>
>>>
>>> - For prefetch & prerender, use the cache instructions (no grace
>>> period or changes)
>>>
>>> This would cripple prefetch and prerender because most dynamic content
>> is marked as non cacheable. Think of prerender as opening a background tab
>> (or middle click, if you prefer), except that the tab is invisible and is
>> then instantly swapped-in on navigation as long as it hasn't expired
>> (insert reasonable TTL here.. Chrome uses 300 seconds).
>>
>>> A couple of additional questions:
>>>
>>> - How would these hints, and specifically preload, interact with
>>> Client Hints?
>>>
>>> Assuming CH is implemented, the relevant hints would be advertised on
>> the outbound request. Nothing special.
>>
>>>
>>> - What about srcset and the picture element (e.g. Native conditional
>>> loading mechanisms)?
>>>
>>> I don't see any concerns here. If you have conditional loading then you
>> must evaluate those conditions.. With native <picture> those conditions
>> will be executed by the preparser (yay) if the main doc parser is
>> blocked... Yes, you may not be able to stick a Link header hint or put a
>> <link> hint in the head of the doc, but such is the cost of conditional
>> fetches. On the other hand, if you *know* you need a specific file
>> regardless, feel free to hint it.
>>
>> ig
>>
>>
>>
>
>
Received on Wednesday, 16 July 2014 00:30:17 UTC