Представьте двух читателей одного и того же сайта. Оба живут в России, оба открывают страницу с телефона, оба пользуются «обычным интернетом». Но один подключён через домашнего провайдера в одном городе, а другой сидит в мобильной сети оператора в другом. Сервер у сайта один, он стоит во Франции. Для карты расстояние до сервера почти одинаковое. Для пакетов это два разных путешествия: через разные сети, разные точки обмена трафиком, разные стыки между операторами. Одно может пройти гладко, другое может оказаться извилистым, а иногда и просто хуже.

Этот зазор между «где стоит сервер» и «как к нему на самом деле ходят» и есть предмет статьи. Вопрос «подходит ли VPS во Франции моей русскоязычной аудитории?» нельзя решить, глядя на карту Европы. Его можно решить только измерениями из тех сетей, откуда приходят ваши люди. Ниже разберём, как такие измерения спланировать, что именно мерить, как не обмануться пингом и как превратить цифры в решение.

Страна сервера и путь клиента — разные вещи

Когда мы говорим «сервер во Франции», мы описываем место, где стоит оборудование дата-центра. Когда пользователь жалуется, что «сайт тормозит», он описывает впечатление от всей цепочки: его устройство, его Wi-Fi или мобильная сеть, его оператор, транзитные сети, сеть дата-центра, сам сервер и приложение на нём. Географическая точка — лишь одно звено.

Важно понимать несколько вещей о такой цепочке.

  • Маршрут определяется договорённостями между сетями, а не линейкой на карте. Операторы обмениваются трафиком по своим соглашениям, и кратчайший по километрам путь не обязан быть выбранным. Поэтому нельзя обещать, что Франция даст географически минимальную задержку для любого читателя: у соседней страны путь для конкретного провайдера может оказаться короче, а может и длиннее.
  • Путь туда и путь обратно могут различаться. Ответ сервера нередко идёт не по тому же маршруту, по которому пришёл запрос. Поэтому трассировка с одной стороны показывает только половину картины.
  • Маршрут меняется во времени. Вечерняя загрузка сетей, плановые работы, перестроение пиринга — всё это сдвигает картину. Один замер днём ничего не доказывает.
  • Разные протоколы могут идти по разным путям. IPv4 и IPv6 у одной и той же пары «клиент — сервер» бывают устроены по-разному, и у части пользователей один из них работает заметно хуже другого.

Отсюда следует рабочая установка: страна — это гипотеза, а маршрут — то, что нужно проверять. Гипотеза «Франция подойдёт» превращается в решение только после набора измерений из конкретных сетей.

С каких сетей начинать: аудитория вместо абстрактной «России»

Слово «Россия» в качестве точки измерения бесполезно: это сотни операторов, десятки крупных и множество мобильных, домашних и корпоративных сетей. Правильный первый шаг — выяснить, из каких сетей реально приходят ваши посетители. Источники для этого у вас уже есть, если сервис работает.

  • Логи веб-сервера или балансировщика с IP-адресами клиентов. По адресам можно определить автономные системы (ASN) — сети операторов — и посчитать долю трафика каждой.
  • Аналитика продукта: города, тип подключения (мобильное или фиксированное), тип устройства.
  • Обращения в поддержку: жалобы вида «у меня не открывается, а у коллеги открывается» — это прямые указания на сети, где стоит присмотреться.

Если сервис ещё не запущен, придётся строить гипотезу из целевой аудитории: где живут ваши люди, какой интернет у них преобладает. Тогда выборка будет приблизительной, и это нужно учитывать при интерпретации. Но даже приблизительный список из пяти–семи сетей лучше, чем «замерим откуда-нибудь».

Для каждой выбранной сети стоит записать три вещи: ASN, тип (домашняя, мобильная, корпоративная) и долю в вашей аудитории. Доля нужна потом, чтобы взвешивать результаты: плохой результат в сети, дающей два процента трафика, и в сети, дающей сорок, — это разные решения.

Где взять точки измерения

Идеальная точка измерения — реальное устройство в нужной сети. Практически это бывает двух видов: ваши собственные тестеры (друзья, коллеги, пользователи, согласившиеся помочь) и публичные платформы с распределёнными пробниками. Для второго случая подходит RIPE Atlas: в документации по пользовательским измерениям описано, что доступны Ping, Traceroute, DNS, TLS и NTP, а HTTP-измерения ограничены и разрешаются индивидуально. Пробники выбираются по стране, ASN, префиксу и идентификатору.

Из этого следуют практические выводы для планирования.

  • Выбор по ASN позволяет целиться в конкретную сеть, а не в страну вообще. Это ровно то, что нужно для нашей задачи.
  • Указанный пробник может оказаться занятым или недоступным, а работа идёт в рамках кредитов и квот. Поэтому план измерений должен быть экономным и допускать подмену пробника в той же сети.
  • Раз HTTP-измерения ограничены, полный запрос приложения через платформу получить не всегда удастся. Для него нужны собственные тестеры или собственные скрипты на устройствах в нужных сетях. Платформа же хорошо отвечает на вопросы о DNS, TLS и пути пакетов.

Эта граница важна: публичные пробники закрывают сетевой уровень, а вопрос «как ведёт себя ваше приложение» придётся измерять иначе. Об этом дальше.

Матрица измерений: что и откуда записывать

Чтобы измерения не превратились в россыпь скриншотов, заранее зафиксируйте форму результата. Ниже — структура таблицы, которую стоит заполнять. Значений в ней нет намеренно: это каркас для ваших будущих замеров, а не чьи-то готовые цифры.

Поля матрицы измерений для каждой пары «сеть клиента — кандидат-локация»
ПолеЧто записыватьЗачем нужно
Сеть клиентаASN, тип (домашняя, мобильная, корпоративная), доля в аудиторииВзвешивать результат по важности сети
Кандидат-локацияФранция, UK или другая площадка, адрес тестового узлаСравнивать варианты на равных условиях
Момент замераДата, час по местному времени клиента, будни или выходныеУвидеть вечернюю и дневную разницу
ПротоколIPv4 или IPv6Найти сети, где один из них заметно хуже
ДоступностьДоля успешных попыток из серииОтделить потери и обрывы от медленной работы
DNSВремя разрешения имениИсключить DNS как скрытую причину задержки
TCP-соединениеВремя установления соединенияОценить сетевой путь без участия приложения
TLS-рукопожатиеВремя до завершения защищённого соединенияУвидеть цену шифрованного канала на этом пути
Первый байтВремя до начала ответа приложенияВыделить работу сервера и приложения
Полный запросОбщая длительность пользовательского действияОценить то, что чувствует человек
ПутьТрассировка в обе стороны, если доступнаОбъяснять аномалии, а не только фиксировать их
ПримечанияЧто менялось: релиз, нагрузка, сбои у оператораНе принять случайное событие за закономерность

Таблица выглядит громоздкой, но каждое поле отвечает на конкретный вопрос, который иначе всплывёт слишком поздно. Например, поле «момент замера» защищает от самого частого заблуждения: «вчера днём было нормально». Поле «протокол» нужно потому, что сеть может прекрасно работать по IPv4 и спотыкаться на IPv6, а сервис, объявивший оба адреса, получит жалобы именно от тех, у кого браузер выбирает проблемный.

Доступность и полный запрос: две разные истории

Первый вопрос к любой локации — достижима ли она вообще из нужной сети и насколько стабильно. Его удобно разделить на два уровня, и это разделение многое проясняет.

Первый уровень — доступность на сетевом уровне: отвечает ли узел, проходит ли соединение, приходит ли TLS-рукопожатие. Тут хороши лёгкие частые пробы. Второй уровень — полный запрос приложения: тот самый путь, который проходит ваш пользователь, когда открывает страницу, входит в аккаунт или отправляет форму. Он тяжелее и дороже, поэтому его делают реже, но без него картина неполна.

Почему нужны оба? Потому что они могут расходиться. Узел отвечает быстро и стабильно, а приложение за ним в вечерний час отвечает медленно из-за собственной нагрузки. Или наоборот: приложение работает хорошо, но у части клиентов соединение иногда обрывается на транзитном участке. Если смотреть только на один уровень, вы припишете проблему не тому звену — и либо будете переезжать без пользы, либо оставите реальную сетевую беду нетронутой.

Почему один замер ничего не стоит

Сетевые условия не стоят на месте. Для честного сравнения нужны замеры в разные моменты: утро, середина дня, вечерний пик, будни и выходные. Минимум — две-три контрольные точки в сутки в течение нескольких дней. Если результаты стабильно близки, вы можете говорить о закономерности. Если они прыгают, это уже находка: значит, у пути есть чувствительность к нагрузке, и её нужно учитывать при выборе.

Разумно также записывать не только среднее, но и разброс. Среднее время ответа в 200 миллисекунд при редких всплесках в несколько секунд ощущается совсем иначе, чем стабильные 250. Пользователь запоминает всплески. Поэтому для решения полезнее смотреть на высокие процентили и долю неудачных попыток, чем на среднее.

Ping против пользовательского действия

Пинг — любимый инструмент и главный источник самоуспокоения. Он измеряет время туда-обратно для маленького служебного пакета. Это полезная величина, но она отвечает на узкий вопрос: насколько быстро туда и обратно ходят пакеты на сетевом уровне, да и то лишь для конкретного типа трафика, который на пути может обрабатываться иначе, чем ваш HTTPS.

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

Вот простой пример с условными числами, придуманными только для иллюстрации. Допустим, задержка пути в одну сторону и обратно — 50 мс. Тогда установление соединения и рукопожатие шифрования вместе могут занять заметно больше этих 50 мс, потому что требуют нескольких обменов. Если путь вырастет вдвое, то и эта часть вырастет примерно вдвое, а общее время действия увеличится не на «лишние 50 мс», а на сумму всех умноженных обменов. Поэтому разница, которая на пинге кажется скромной, на полном действии может стать ощутимой.

Как curl разделяет запрос на этапы

Чтобы увидеть эти этапы по отдельности, удобен curl. В руководстве curl описаны переменные времени, которые можно вывести после запроса: time_namelookup, time_connect и time_appconnect показывают время от начала операции до завершения DNS, TCP-соединения и TLS-рукопожатия соответственно. Переменная time_starttransfer включает подготовку и обработку запроса сервером до первого байта, а time_total — полную длительность.

Ключевая деталь, которую легко упустить: эти показатели накопительные. Каждый отсчитывается от начала операции, а не от конца предыдущего этапа. Значит, их нельзя просто складывать, как независимые куски, и нельзя считать, что time_connect — это «время TCP» само по себе. Чтобы получить длительность отдельного этапа, из значения нужного этапа вычитают значение предыдущего. Например, чистое время TLS — это разница между time_appconnect и time_connect, а время работы сервера до первого байта — разница между time_starttransfer и time_appconnect.

Для вывода можно использовать шаблон формата. Адрес здесь условный:

curl -o /dev/null -s -w "dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n" https://example.com/

Запустите такую команду из каждой сети матрицы много раз и разными часами, а результаты записывайте в соответствующие поля. Дальше интерпретация зависит от того, какой этап «поехал».

  • Растёт DNS — проблема не в расположении сервера, а в разрешении имён: резолвер оператора, настройки записей, срок кэширования.
  • Растёт время соединения и рукопожатия — виноват сетевой путь до узла. Здесь локация и маршрут реально влияют.
  • Растёт интервал от рукопожатия до первого байта — виновато приложение или сервер: база данных, очереди, медленный код. Менять страну сервера бессмысленно, пока вы это не исправите.
  • Растёт интервал от первого байта до конца — тяжёлый ответ или ограниченная пропускная способность на пути.

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

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации Россия, США, Франция и Великобритания. Оплата картой РФ и по СБП.

АРЕНДОВАТЬ СЕРВЕР

IPv6, DNS и TLS: три места, где прячутся сюрпризы

Некоторые проблемы не видны ни в пинге, ни в среднем времени ответа, но бьют по части пользователей сильнее всего.

IPv6. Если у сервиса есть записи для обоих протоколов, клиент выбирает, чем ходить. В одних сетях IPv6 работает не хуже IPv4, в других путь хуже или нестабилен. В результате часть пользователей получает медленное или прерывающееся соединение, а ваши тесты по IPv4 этого не видят. Поэтому в матрице отдельное поле для протокола: замеряйте оба пути из каждой сети и сравнивайте их. Если IPv6 в важной для вас сети заметно проблемнее, решение — либо чинить, либо осознанно не публиковать IPv6-запись, но сначала нужно знать, что проблема есть.

DNS. Время разрешения имени входит в каждое новое посещение. Если ответ приходит издалека или резолвер клиентского оператора медленный, пользователь потеряет время ещё до первого соединения. Пробники с поддержкой DNS-измерений, как в RIPE Atlas, помогают увидеть, как ваше имя разрешается из разных сетей. Это вопрос настроек записей и авторитативных серверов, а не расположения VPS, и о нём важно помнить, чтобы не обвинить Францию в чужих грехах.

TLS. Рукопожатие шифрования добавляет обмены поверх соединения, и на дальнем или нестабильном пути оно ощущается сильнее. Кроме времени, стоит замечать сами ошибки рукопожатия: если в какой-то сети они случаются заметно чаще, это отдельная проблема, которая в среднем времени не видна, зато видна в доле неудачных попыток.

Превращаем измерения в порог решения

Набор таблиц ещё не решение. Решение появляется, когда вы заранее договорились, какой результат считать приемлемым. Без этого любые цифры допускают любую интерпретацию: если хочется остаться — найдутся аргументы, если хочется переехать — тоже.

Здесь пригодится подход из инструментов нагрузочного тестирования. В документации Grafana k6 описаны пороги (thresholds): они задают условия прохождения теста по метрикам, например по задержке или частоте ошибок, а невыполненные условия приводят к неуспешному результату теста. Сама идея полезна и вне k6: сформулируйте критерии до измерений и считайте результат провальным, если они не выполнены.

Конкретные значения порогов должны исходить из вашего продукта, а не из примеров чужой документации. Числа из примеров документации не являются целевыми показателями для вашего сайта. Для интерактивного сервиса, где пользователь вводит данные и ждёт ответа, допуски строже. Для страницы со статьями, которую открывают редко и читают долго, они мягче. Разумный способ выбрать их — посмотреть на текущие показатели сервиса и решить, какое ухудшение пользователи заметят и не простят.

Пороги стоит формулировать по сетям и с учётом их веса. Например, по такой схеме (значения вы подставите сами):

  • для каждой сети с долей аудитории выше выбранной границы: доля успешных запросов не ниже вашего порога во все контрольные часы;
  • для тех же сетей: выбранный высокий процентиль времени полного действия не выше вашего допуска в вечерний пик;
  • для всех сетей: время до первого байта отдельно от сетевой части не выходит за допуск, чтобы не путать приложение с маршрутом;
  • для IPv6: результат не хуже IPv4 более чем на заданную долю, иначе IPv6 пока не рекламируется.

Если кандидат-локация проходит пороги во всех значимых сетях, она подходит. Если проваливает в одной из важных, у вас есть конкретная причина и конкретная сеть, а не смутное ощущение «вроде медленнее».

Роль французского узла в архитектуре

Результаты замеров нужно связать с тем, что именно вы собираетесь разместить во Франции. Одно дело — вынести туда всё приложение вместе с базой данных, другое — поставить точку входа или отдельный сервис.

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

Если же узел выполняет фоновую роль — принимает веб-хуки, ведёт обработку, хранит архив, держит вспомогательный сервис — то чувствительность к задержке до клиента существенно ниже, и на первый план выходят другие свойства: стабильность канала, предсказуемость, расположение относительно остальных частей системы. Для таких задач разница в маршрутах из отдельных российских сетей может оказаться второстепенной, а условия внешних зависимостей — главными.

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

Важно честно признать границы. Расположение во Франции само по себе не решает вопросов доступности сторонних сервисов, и нельзя исходить из того, что внешний API будет одинаково работать с любым иностранным адресом. Если ваш сервис зависит от внешних API или от требований законодательства, это отдельные проверки, а не следствие выбора страны сервера. Нельзя считать, что география площадки автоматически обеспечивает соответствие требованиям закона или обходит внешние ограничения. Эти вопросы нужно проверять отдельно, исходя из вашей задачи.

Как сравнить Францию с соседними площадками

Пользоваться матрицей можно для любого числа кандидатов. В публичном предложении MAATRIX перечислены UK, US, RU и FR, поэтому тот же набор измерений можно прогнать по нескольким локациям и сравнить на равных условиях: тот же тестовый узел, те же сети, те же часы, тот же протокол. Только при таком условии сравнение честно. Если замерять Францию вечером, а соседнюю площадку утром, вы сравните не локации, а время суток.

На практике это означает развернуть небольшой тестовый стенд в каждой интересующей локации. Для такого стенда подходит минимальный тариф, например Ba с одним vCPU, 2 ГБ RAM и 40 ГБ NVMe: ресурсы нужны только для того, чтобы отдавать тестовую страницу и тестовый эндпоинт, имитирующий работу приложения. Ресурсы плана — лишь отправная точка для теста и ничего не говорят о ёмкости под вашу нагрузку; реальную нагрузку нужно проверять отдельно. Узлы на платформе MAATRIX работают на NVMe и процессорах AMD EPYC с root-доступом, оплата возможна картой РФ или через СБП, а VPS создаётся автоматически вскоре после оплаты, так что поднять и убрать тестовые стенды можно без долгой подготовки. Подробности и доступные площадки смотрите на странице аренды VPS.

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

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

Что делать с результатами

Когда матрица заполнена, у вас на руках не вердикт «Франция хороша» или «Франция плоха», а карта по сетям. Прочитайте её по строкам.

  • Если все значимые сети проходят пороги в разные часы и по обоим протоколам, кандидат подходит. Закрепляйте выбор и продолжайте наблюдать после запуска: маршруты меняются.
  • Если провал в одной маленькой сети, взвесьте его с долей аудитории. Возможно, это приемлемая цена, а возможно, повод для отдельного решения для этой группы.
  • Если провал в крупной сети, а у другой локации она проходит, кандидат уступает, и это уже веская причина.
  • Если провал связан со временем до первого байта, а сеть и рукопожатие в порядке, переезд ничего не исправит: чините приложение.
  • Если результаты нестабильны и зависят от часа, продолжайте замеры дольше, прежде чем решать.

Отдельно стоит помнить, что результат относится к моменту измерения. Маршруты и загрузка сетей меняются, поэтому имеет смысл оставить лёгкие регулярные пробы работающими и после выбора локации, а пороги — в силе как сигнал тревоги.

Решает сеть пользователя, а не картинка Европы

Вернёмся к двум читателям из начала. Их разделяет не расстояние до Франции, а то, какими сетями они к ней добираются. Поэтому честный ответ на вопрос «подойдёт ли французский VPS» звучит так: это зависит от сетей ваших реальных пользователей, и это можно выяснить. Составьте список сетей по долям аудитории, заранее выберите пороги, снимите DNS, соединение, рукопожатие, первый байт и полное действие в разное время суток по обоим протоколам, сравните кандидатов на одинаковых стендах — и принимайте решение по тем сетям, которые приводят к вам людей, а не по ощущению от карты.