Есть ли ограничение на количество доменов, которые мы должны предварительно подключить с помощью dns-prefetch к Chrome?

Когда мы хотим обеспечить невероятно быстрый веб-сайт, который использует сторонние виджеты/плагины/надстройки/аналитику и т. д. сэкономив немного для поиска DNS и т. д.)

Я не смог найти документ, в котором бы указывалось, сколько доменных имен мы можем «предварительно подключить к dns-prefetch», прежде чем мы потеряем какую-либо потенциальную выгоду. Помните, как в старые времена у Internet Explorer было ограничение на количество изображений, которые можно было загружать параллельно, просто интересно, может ли Chrome иметь какие-то причины для ограничения запроса «dns-prefetch preconnect»?

Например: сколько слишком много?

<link rel="dns-prefetch preconnect" href="https://admin.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://api.amplitude.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://api.segment.io" crossorigin />
<link rel="dns-prefetch preconnect" href="https://app.launchdarkly.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://bam.nr-data.net" crossorigin />
<link rel="dns-prefetch preconnect" href="https://cdn.amplitude.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://cdn.segment.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://customer.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://embed.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://event.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://events.launchdarkly.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://images.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://js-agent.newrelic.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://js.driftt.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://load.sumo.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://metrics.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://renderer-assets.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://static.addtoany.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://sumo.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://weclean1.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.google-analytics.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.googletagmanager.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.youtube.com" crossorigin />

Любая обратная связь/совет по ссылкам приветствуется!


person dankilev    schedule 31.03.2019    source источник


Ответы (4)


Подсказки ресурсов не должны использоваться слишком часто

Во-первых, как указано ниже, вы должны предпочесть preload. Если вы точно не знаете, какие ресурсы будут содержаться на вашей странице, dns-prefetch и preconnect могут подойти.

спецификация подсказки ресурса указывает, что оптимальное количество подключений сильно зависит от обстоятельств:

Оптимальное количество подключений на источник зависит от согласованного протокола, текущего профиля подключения пользователя, доступных ресурсов устройства, глобальных ограничений на подключение и других переменных, зависящих от контекста. В результате решение о том, сколько соединений следует открыть, откладывается на пользовательский агент.

И dns-prefetch, и preconnect указывают, что пользовательский агент "должен" инициировать процесс, что означает, что он не обязан этого делать.

Илья Григорик, редактор этой спецификации, говорит

Тем не менее, используйте его с умом: каждый открытый сокет влечет за собой затраты как на клиенте, так и на сервере, и вы хотите избежать открытия сокетов, которые могут остаться неиспользованными. Как всегда, применяйте, измеряйте реальное влияние и повторяйте, чтобы получить максимальную отдачу от этой функции.

Серхио Гомес, также сотрудник Google, подпевает предупреждению Ильи, добавив немного конкретики. :

Имейте в виду, что, хотя <link rel="preconnect"> довольно дешев, он все же может занимать ценное процессорное время, особенно при защищенных соединениях. Это особенно плохо, если соединение не используется в течение 10 секунд, так как браузер закрывает его, тратя впустую всю эту раннюю работу с соединением.

В общем, старайтесь использовать <link rel="preload"> везде, где это возможно, так как это более комплексная настройка производительности, но держите <link rel="preconnect"> в своем наборе инструментов для крайних случаев.

Сержио продолжает иллюстрировать пару примеров, где подходит preconnect, а не preload. Я настоятельно рекомендую посмотреть их.

Иван Акулов, бывший сотрудник Google и нынешний генеральный директор стартапа по веб-производительности, предлагает числовую рекомендацию:

Вы хотите ускорить более 4-6 доменов. Не рекомендуется использовать <link rel="preconnect" /> с более чем 4-6 доменами, так как открытие и поддержание соединения — затратная операция. <link rel="dns-prefetch" /> более легкий, поэтому используйте его для других сторонних доменов, если вы хотите ускорить их работу.

Но Иван, хотя и является авторитетным источником, не оказывает жесткой технической поддержки этой рекомендации.

Не читая исходный код для каждого соответствующего браузера, невозможно обоснованно сказать, сколько dns-prefetch/preconnects слишком много. Даже после прочтения исходного кода можно лишь подсказать, сколько из них подходит. Жесткого ограничения нет, но приведенные выше авторитетные источники дают нам повод для осторожности.

Но трудно понять, где провести черту

Есть только один способ улучшить производительность:

  1. решите, какие показатели важны для вас и ваших пользователей
  2. использовать наилучшие доступные синтетические и реальные пользовательские числа для измерения статус-кво
  3. внести изменения и измерить разницу

Чтобы получить наилучшую возможную конфигурацию, потребуется несколько итераций. И оптимальный выбор подсказки может меняться со временем. С точки зрения ремонтопригодности было бы лучше агрессивно предварительно подключить все, что соответствует требованиям «пограничного случая» Сержио, и доверить браузеру выполнение своей работы. Но опять же, никогда без тестирования.

Еще пара заметок

Это много сторонних зависимостей для этой страницы. Я уверен, что вы работаете в соответствии со своими требованиями, но сейчас самое время попросить руководство пересмотреть необходимость некоторых из них.

Наконец, имейте в виду, что crossorigin подходит не для каждой подсказки ресурса. Это зависит от того, будут ли загружаемые ресурсы использовать CORS. Если вы не знаете, это может удвоить количество необходимых предварительных соединений.

Атрибут crossorigin при использовании с rel="preconnect" описывает не местонахождение целевого источника, а то, какие ресурсы будут загружены из этого источника. Если активы используют CORS, требуется crossorigin. Если CORS не будет использоваться, crossorigin следует опустить. Если будут присутствовать оба типа активов, необходимы две подсказки ресурсов.

Взгляните на этот список ресурсов, использующих CORS. для руководства.

person Michael Crenshaw    schedule 23.04.2019
comment
Спасибо, Майкл, да, в моем случае я не (хочу) постоянно точно знать, какие ресурсы будут включены на страницу. Это действительно сложный вопрос, и я в основном искал лучший совет для компромисса по ряду соединений с точки зрения Chrome. +1 - person dankilev; 23.04.2019
comment
Справедливо! Я ненавижу, что ответы на такого рода вопросы часто бывают такими нечеткими. Но команда Chrome внедряет функции так быстро, что я уверен, что у них не часто есть возможность вернуться и обсудить более тонкие моменты. - person Michael Crenshaw; 23.04.2019
comment
После некоторых тестов я остановился на 5. Любые дополнительные советы от Chrome также были бы полезны. Ваше здоровье! - person dankilev; 23.04.2019
comment
Пока мы не узнаем ничего лучше, я принял ваш ответ, который определенно может направить людей в правильном направлении. На данный момент потребуются дополнительные тесты. Спасибо еще раз! - person dankilev; 23.04.2019
comment
Это хороший ответ, но он действительно не отвечает на вопрос ;) - person Rick Davies; 01.11.2019
comment
@RickDavies, спасибо! К сожалению, не все ответы являются скалярами. Некоторые больше похожи на функции. - person Michael Crenshaw; 01.11.2019

Также помните об этой ошибке, если вам небезразличен Safari:

https://web.dev/preconnect-and-dns-prefetch/

Поддержка браузером dns-prefetch немного отличается от поддержки предварительного подключения, поэтому dns-prefetch может служить запасным вариантом для браузеров, не поддерживающих предварительное подключение.

<link rel="preconnect" href="http://example.com">
<link rel="dns-prefetch" href="http://example.com">

Рекомендуется — для безопасного применения резервного метода используйте отдельные теги ссылок.

<link rel="preconnect dns-prefetch" href="http://example.com">

Не рекомендуется — реализация отката dns-prefetch в том же теге вызывает ошибку в Safari, из-за которой предварительное подключение отменяется.

person Null    schedule 16.08.2019

В старых версиях Chrome существовало ограничение на шесть одновременных запросов DNS. Начиная с версии Chrome 26 для Windows, Mac и Linux, существует асинхронный преобразователь DNS, который фактически снял это ограничение (или, возможно, просто увеличил его):

"6 DNS-запросов больше не соответствуют действительности при использовании асинхронного резолвера DNS, но ваша точка зрения остается в силе.. мы ограничиваем количество резолвов во время передачи", — Илья Григорик, веб-инженер по производительности в Google (через Twitter)

person Rick Davies    schedule 31.10.2019

Я новичок и пока не могу добавить комментарий, поэтому вместо этого добавляю ответ.

Судя по моим собственным тестам, Chrome имеет TTL 1000 в кэше DNS Это может быть причиной того, что при открытии "слишком рано" "dns-prefetch preconnect" соединение на самом деле может оказать негативное влияние на желаемую производительность.

Вы также можете проверить подсказки ресурсов preconnect vs dns-prefetch

«TTL» — это аббревиатура от Time To Live.

person Community    schedule 25.04.2019