Назад | Перейти на главную страницу

Почему связывание происходит медленнее, чем у публичных DNS-провайдеров

У нас есть привязка 9.8.1.dfsg.P1-4ubuntu0.13 в ubuntu 12.04, который работает на не сильно загруженном сервере (средняя нагрузка: 0,19, 0,12, 0,13) и обслуживает запросы для небольшой офисной сети с рабочими станциями macos и ubuntu.

Я выполнил несколько тестов DNS в скрипте на контейнере, который работает как DNS-сервер, и отправил результаты в Infxdb.

#!/bin/bash
while true
do
        rndc flush

        bind_timeout=$( dig @192.168.128.3 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        google_timeout=$( dig @8.8.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        yandex_timeout=$( dig @77.88.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "bind,server=bind,without_cache=yes value=$bind_timeout" &
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "google,server=google,without_cache=yes value=$google_timeout" &
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "yandex,server=yandex,without_cache=yes value=$yandex_timeout" &
        wait

        bind_timeout=$( dig @192.168.128.3 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        google_timeout=$( dig @8.8.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        yandex_timeout=$( dig @77.88.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' )
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "bind,server=bind,without_cache=no value=$bind_timeout" &
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "google,server=google,without_cache=no value=$google_timeout" &
        curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "yandex,server=yandex,without_cache=no value=$yandex_timeout" &
        wait

        sleep 5
done

Я обнаружил, что привязка отвечает на запросы медленнее, чем 8.8.8.8 и 77,88,8,8. Это можно увидеть на графиках:

Очистка кеша перед первой серией запросов с rndc flush. Bind использует Google 8.8.8.8 и 8.8.4.4 в качестве экспедиторов:

Никогда не очищайте кеш запущенного bind. Bind использует Google 8.8.8.8 и 8.8.4.4 в качестве экспедиторов:

Очистка кеша перед первой серией запросов с rndc flush. Bind использует обновленный список корневых серверов в качестве серверов пересылки:

Никогда не очищайте кеш запущенного bind. Bind использует обновленный список корневых серверов в качестве серверов пересылки:

Почему максимальное время запроса (около 5 КБ на первом графике и 2,5 КБ на третьем графике) с общедоступным DNS Google больше, чем корневые серверы?

Почему сквозная привязка запросов выполняется медленнее, чем прямой запрос общедоступных DNS-серверов?

Может что-то не так в моих тестах?

ОБНОВЛЕНИЕ 1

На графиках TTL 20 секунд - это неправильно. TTL для redhat.com составляет 60 секунд.

Ваши тесты измеряют общее время выполнения вашего запроса, включая

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

Результаты вполне соответствуют ожиданиям.

  • Если вы запрашиваете свой локальный сервер BIND, не очищая кеш, ответ в большинстве случаев будет приходить из кеша. Даже если TTL для A RR истек, NS RR все еще будет в кэше, поэтому извне нужно запрашивать только сам A RR.
  • Если вы запрашиваете свой локальный сервер BIND после очистки кеша и имеете не настроенные серверы пересылки, ваш локальный сервер BIND будет выполнять рекурсивный запрос, начиная с корневого сервера и ниже.
  • Если вы запрашиваете свой локальный сервер BIND после очистки кеша и настроили серверы Google в качестве пересылки, ваш локальный сервер BIND перенаправит запрос как есть на один из серверов Google, который, в свою очередь, либо ответит на запрос из своего кеша, либо выполнить рекурсивный запрос. Обратите внимание, что у вас нет контроля над кешем серверов Google.

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