Почему такая большая разница во времени, если доменное имя разрешается самой ping, а не внешним getent?


$ time ping -c1 "google.com""
0% packet loss
0m5,064s

$ time (ip=$(getent ahostsv4 "google.es" | awk '{ print $1 }' |
head -n1); ping -c1 "${ip}")
0% packet loss
0m0,042s
0
Alberto Salvia Novella 24 Окт 2019 в 01:31
time покажет, сколько времени потребовалось для запуска команды, а не сколько времени занял ping. Если вы ping <bogus ip>, time сообщит вам, что, например, 10 с, когда никогда не было реального пинга.
 – 
schrodigerscatcuriosity
24 Окт 2019 в 01:52
Вот что я имел в виду, что время - это не фактический пинг, а инструмент, пытающийся решить имя. Разница во времени делать одно и то же большая.
 – 
Alberto Salvia Novella
24 Окт 2019 в 01:54
Попробуйте запустить команды несколько раз подряд, и вы увидите, что нет четкого шаблона... насколько я пробовал.
 – 
schrodigerscatcuriosity
24 Окт 2019 в 02:00
Первый случай всегда занимает более 5 с, второй случай всегда менее 100 мс.
 – 
Alberto Salvia Novella
24 Окт 2019 в 02:03

1 ответ

Успешным обходным решением в файле /etc/resolv.conf было добавление:

options single-request-reopen

Предлагаю основную проблему:

Устанавливает RES_SNGLKUPREOP в _res.options. Резолвер использует тот же сокет для запросов A и AAAA. Некоторое оборудование ошибочно отправляет назад только один ответ. Когда это произойдет, клиентская система остановится и ждите второго ответа. Включение этой опции изменяет это поведение, так что если два запроса с одного и того же порта не обрабатываются правильно он закроет сокет и откроет новый перед отправкой второй запрос.

Поэтому отключение IPv6 на моем маршрутизаторе Google Wifi решило проблему.

2
Alberto Salvia Novella 24 Окт 2019 в 17:56