Медленный ответ от getaddrinfo

Я использую getaddrinfo, чтобы сделать запросы DNS от C++ в Windows. Я раньше использовал Windows API DnsQuery, и это хорошо работало, но при добавлении поддержки IPv6 моему программному обеспечению я переключился на getaddrinfo. С тех пор я видел следующее:

Моя проблема состоит в том, что несколько раз getaddrinfo занимают очень долгое время для завершения. Типичный ответ от getaddrinfo берет всего несколько миллисекунд, но примерно в 1 раз из 10 000, он занимает время, в некоторых случаях приблизительно 15 секунд, но было несколько случаев, когда требуется несколько минут.

Я выполнил Wireshark на сервере и проанализировал мои журналы отладки приложений и вижу следующее:

  • Я вызываю функцию getaddrinfo.
  • 15 секунд спустя моя машина запрашивает сервер DNS.
  • Некоторые миллисекунды позже, я получаю ответ от сервера DNS.

Странная вещь здесь состоит в том, что фактический запрос DNS только занимает одну десятую секунды, но время getaddrinfo на самом деле выполняется, намного длиннее.

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

Таким образом, что getaddrinfo делает больше, чем контакт сервер DNS?

Править:

  • Проблема произошла с несколькими адресами. Если я пытаюсь воспроизвести проблему с помощью этих адресов, проблема не происходит.
  • Я сделал что-то глупое. На каждый запрос DNS, и т.д./сервисы анализируется. Однако это не объясняет задержку на нескольких минутах. (спасибо D.Shawley)

Редактирование 2

  • Один тип запросов DNS, сделанных моим программным обеспечением, является запросами DNSBL против спама. Журнал от одного пользователя показал мне, что поиск для ip.address1.example.com всегда, казалось, занял точно 2 039 секунд, в то время как поиск для another.ip.address.example.com всегда занимал точно 1 324 секунды. На следующий день после этого поиски для тех адресов были очень хорошо. Сначала я думал, что авторы BL DNS поместили некоторый тайм-аут на свою сторону. Но если это было базовой проблемой, getaddrinfo должен был испытать таймаут ранее?
9
задан Georg Fritzsche 22 November 2009 в 10:40
поделиться

1 ответ

В Windows есть локальный демон, который выполняет кэширование DNS. Ваш вызов getaddrinfo () направляется этому демону, который предположительно проверяет свой кеш перед отправкой запроса на ваш DNS-сервер.

См. статью 318803 базы знаний Windows для получения дополнительной информации об отключении кеша.

[Отредактировано]

Мне кажется, что ваш экземпляр Windows Server 2003 неправильно настроен для IPv6. По истечении времени ожидания поиска IPv6 он вернется к IPv4. Статьи базы знаний, которые могут помочь, включают:

К сожалению, у меня нет доступа ни к одному серверу Windows, поэтому я не могу проверить / воспроизвести его самостоятельно.

4
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: