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

Хорошим примером служит система доменных имен (DNS). DNS по природе своей является распределенной системой, корневые узлы которой разбросаны по всей планете. Чтобы просто зайти на любой сайт, сначала необходимо получить его IP-адрес.

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

Итак, где же взять адрес DNS резолвера?

  1. Интернет-провайдер предоставляет адрес своего DNS резолвера.
  2. Найти в интернете адрес публичного резолвера.
  3. Поднять свой или использовать встроенный в ваш домашний роутер.

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

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

Когда список небольшой, то его легко можно “пропинговать” руками и сравнить время задержек, но если хотя бы взять список, упомянутый выше, то это занятие уже становится малоприятным.

Поэтому для облегчения этой задачи, я преисполненный синдромом самозванца набросал на Go proof-of-concept своей идеи под названием get-closer.

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

$ get-closer ping -f dnsresolver.txt -b=0 --count=10
Closest hosts:
1.0.0.1 [3.4582ms]
8.8.8.8 [6.7545ms]
1.1.1.1 [12.6773ms]
8.8.4.4 [16.6361ms]
9.9.9.9 [40.0525ms]


В своё время, когда я выбирал для себя резолвер, то ограничивался лишь проверкой основных адресов (1.1.1.1, 8.8.8.8, 9.9.9.9),- ведь они такие красивые, да и чего ждать от резервных некрасивых адресов.

Но раз появился автоматизированный способ сравнить задержки, то почему бы не расширить список…

Как показал тест, мне подходит больше “резервный” адрес Cloudflare, так как он воткнут в spb-ix, который для меня гораздо ближе, чем msk-ix, в который воткнут красивый 1.1.1.1

Разница, как вы видите, существенная, потому что даже самому быстрому лучику света не удается добежать из Питера до Москвы меньше чем за 10 мс.

Помимо простого пинга, в PoC есть еще возможность сравнить задержки и по другим протоколам, таким как http и tcp, а также время преобразования доменов в IP через определенный резолвер.

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

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