LINUX.ORG.RU
ФорумAdmin

Медленное разрешение имен

 


0

1

Столкнулся со странной проблемой. На компьютере медленно отрабатывает разрешение доменых имен при скачке из интернета. Причем так себя ведут и wget и curl и функции вызываемые из php. При этом nslookup и Ping отрабатывает мгновенно, а wget висит на разрешении имени. DNS в resolv.conf прописывал разные - локальный, провайдера, гугловский, яндекса. Если прописать хост в /etc/hosts отрабатывает мгновенно. OS - древняя gentoo, не обновлялась наверное с 2012.

Куда копать?

cat /etc/nsswitch.conf  | grep host
hosts:       files dns
external etc # time nslookup yandex.ru
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   yandex.ru
Address: 77.88.55.55
Name:   yandex.ru
Address: 5.255.255.5
Name:   yandex.ru
Address: 5.255.255.55
Name:   yandex.ru
Address: 77.88.55.66


real    0m0.023s
user    0m0.000s
sys     0m0.000s

external etc # time ping -c 1 yandex.ru
PING yandex.ru (5.255.255.55) 56(84) bytes of data.
64 bytes from yandex.ru (5.255.255.55): icmp_req=1 ttl=53 time=16.9 ms

--- yandex.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.998/16.998/16.998/0.000 ms

real    0m0.084s
user    0m0.000s
sys     0m0.000s

external etc # time wget yandex.ru
--2016-02-19 13:59:59--  http://yandex.ru/
Распознаётся yandex.ru... 77.88.55.55, 5.255.255.5, 5.255.255.55, ...
Устанавливается соединение с yandex.ru|77.88.55.55|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 302 Moved temporarily
Адрес: http://www.yandex.ru/ [переход]
--2016-02-19 14:00:09--  http://www.yandex.ru/
Распознаётся www.yandex.ru... 5.255.255.5, 77.88.55.66, 77.88.55.55, ...
Повторное использование соединения с yandex.ru:80.
Запрос HTTP послан, ожидается ответ... 302 Found
Адрес: https://www.yandex.ru/ [переход]
--2016-02-19 14:00:15--  https://www.yandex.ru/
Устанавливается соединение с www.yandex.ru|5.255.255.5|:443... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 Ok
Длина: 63341 (62K) [text/html]
Saving to: «index.html.2»

100%[===================================================================================================================================================================================================>] 63,341      --.-K/s   в 0.04s

2016-02-19 14:00:15 (1.59 MB/s) - «index.html.2» saved [63341/63341]


real    0m15.430s
user    0m0.000s
sys     0m0.020s

не видно сколько времени идет каждая из этих фаз:
Распознаётся yandex.ru... 77.88.55.55, 5.255.255.5, 5.255.255.55, ...
Устанавливается соединение с yandex.ru|77.88.55.55|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 302 Moved temporarily
Адрес: http://www.yandex.ru/ [переход]

можно преположить что долго ожидается ответ по 302.

выполни команду в таком формате:

wget yandex.ru 2>&1  | while read line ; do echo "`date -Ins  ` $line" ;done  

bl ★★★ ()
Ответ на: комментарий от bl
2016-02-19T14:48:15,130733014+0300 --2016-02-19 14:48:15--  http://yandex.ru/
2016-02-19T14:48:25,161132226+0300 Распознаётся yandex.ru... 5.255.255.55, 5.255.255.5, 77.88.55.55, ...
2016-02-19T14:48:25,185462203+0300 Устанавливается соединение с yandex.ru|5.255.255.55|:80... соединение установлено.
2016-02-19T14:48:25,211406390+0300 Запрос HTTP послан, ожидается ответ... 302 Moved temporarily
2016-02-19T14:48:25,213213997+0300 Адрес: http://www.yandex.ru/ [переход]
2016-02-19T14:48:25,215069210+0300 --2016-02-19 14:48:25--  http://www.yandex.ru/
2016-02-19T14:48:30,252088378+0300 Распознаётся www.yandex.ru... 77.88.55.55, 77.88.55.66, 5.255.255.55, ...
2016-02-19T14:48:30,254247605+0300 Повторное использование соединения с yandex.ru:80.
2016-02-19T14:48:30,286915350+0300 Запрос HTTP послан, ожидается ответ... 302 Found
2016-02-19T14:48:30,289165093+0300 Адрес: https://www.yandex.ru/ [переход]
2016-02-19T14:48:30,291478662+0300 --2016-02-19 14:48:30--  https://www.yandex.ru/
2016-02-19T14:48:30,311587561+0300 Устанавливается соединение с www.yandex.ru|77.88.55.55|:443... соединение установлено.
2016-02-19T14:48:30,517394726+0300 Запрос HTTP послан, ожидается ответ... 200 Ok
2016-02-19T14:48:30,519936373+0300 Длина: 63033 (62K) [text/html]
2016-02-19T14:48:30,526937709+0300 Saving to: «index.html.1»
2016-02-19T14:48:30,531918371+0300
2016-02-19T14:48:30,558512101+0300 0K .......... .......... .......... .......... .......... 81% 1.20M 0s
2016-02-19T14:48:30,560554541+0300 50K .......... .                                          100% 11.4M=0.04s
2016-02-19T14:48:30,562497970+0300
2016-02-19T14:48:30,564419679+0300 2016-02-19 14:48:30 (1.44 MB/s) - «index.html.1» saved [63033/63033]
2016-02-19T14:48:30,566568856+0300
hellstad ()
Ответ на: комментарий от hellstad

2016-02-19T14:48:15,130733014+0300 --2016-02-19 14:48:15-- http://yandex.ru/
2016-02-19T14:48:25,161132226+0300 Распознаётся yandex.ru... 5.255.255.55, 5.255.255.5, 77.88.55.55, ...

вынужден признать что это либо резолв, либо что-то между выводом первого текста и резолва.

мой strace говорит что у меня делаюся в этот период такие вызовы:

write(2, "--2016-02-19 13:57:38--  http://"..., 43) = 43
stat("/home/username/.netrc", 0x7fff03c9be80) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe223ebd000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2997
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fe223ebd000, 4096)            = 0
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "Resolving yandex.ru (yandex.ru)."..., 35) = 35

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

bl ★★★ ()
Ответ на: комментарий от bl

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

ТС, давай сюда вывод

$ strace -Ttt wget http://yandex.ru/

anonymous ()
Ответ на: комментарий от anonymous

Не стоит strace.

external etc # time dig yandex.ru +nssearch
SOA ns1.yandex.ru. sysadmin.yandex-team.ru. 2016021900 600 300 2592000 900 from server 93.158.134.1 in 16 ms.
SOA ns1.yandex.ru. sysadmin.yandex-team.ru. 2016021900 600 300 2592000 900 from server 213.180.193.1 in 18 ms.
;; connection timed out; no servers could be reached

real    0m15.017s
user    0m0.000s
sys     0m0.000s
external etc # time dig yandex.ru

; <<>> DiG 9.8.1 <<>> yandex.ru
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14014
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;yandex.ru.                     IN      A

;; ANSWER SECTION:
yandex.ru.              206     IN      A       5.255.255.55
yandex.ru.              206     IN      A       5.255.255.5
yandex.ru.              206     IN      A       77.88.55.66
yandex.ru.              206     IN      A       77.88.55.55

;; Query time: 1 msec
;; SERVER: 10.1.128.30#53(10.1.128.30)
;; WHEN: Fri Feb 19 15:42:34 2016
;; MSG SIZE  rcvd: 91


real    0m0.007s
user    0m0.000s
sys     0m0.000s
external etc #
Добавил «options single-request» в /etc/resolv.conf, так работает быстро. Но хотелось бы докопаться до причины.

Но куда ломится dig +nssearch, что получает ";; connection timed out; no servers could be reached" - не ясно. Он уже получил ответ от обоих DNS яндекса.

hellstad ()
Ответ на: комментарий от hellstad

Да, при запросе dig +nssearch первые две строки ответа выводятся мгновенно, третья с таймаутом - с задержкой.

hellstad ()
Ответ на: комментарий от hellstad

Но куда ломится dig +nssearch, что получает ";; connection timed out; no servers could be reached" - не ясно. Он уже получил ответ от обоих DNS яндекса.

у имен ns1.yandex.ru и ns2.yandex.ru есть еще AAAA-записи:

ns1.yandex.ru.          86390   IN      AAAA    2a02:6b8::1
ns2.yandex.ru.          86392   IN      AAAA    2a02:6b8:0:1::1
и dig туда тоже запросы шлет, но ответов от них нет (у меня), поэтому ждет таймаута

anonymous ()

А это все не последствия того что все ломанулись и обновились после совсем недавнего решета в getaddrinfo() ?

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

ну да, скорее всего... особенно учитывая это:

OS - древняя gentoo, не обновлялась наверное с 2012.

anonymous ()
Ответ на: комментарий от anonymous

возможно, это старый известный баг с разрешением адресов:

The resolver uses the same socket for the A and AAAA requests. Some hardware mistakenly only sends back one reply. When that happens the client sytem will sit and wait for the second reply. Turning this option on changes this behavior so that if two requests from the same port are not handled correctly it will close the socket and open a new one before sending the second request.

решение: в файл /etc/resolv.conf добавить опцию

options single-request-reopen

Iron_Bug ★★★★★ ()
Ответ на: комментарий от Iron_Bug

скорее просто ipv6 адрес на сетевом интерфейсе есть, а v6-сети нет, вот запросы и уходят без шансов получить ответ

anonymous ()
Ответ на: комментарий от anonymous

даже если v6 сеть есть, этот баг проявляется. это косяк в реализации. просто наступали на это неоднократно при работе.

Iron_Bug ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.