Приключения reactphp/http-client и волшебного dns резолвера

флоппик

promotor fidei
Команда форума
Партнер клуба
Если вдруг кто-то использует https://github.com/reactphp/http-client для запросов внутри подсети например, на соседнюю амазоновскую тачку (а то и даже на эту же самую, на другой домен, как мы делаем на стейджинге) то будьте в курсе, что он по-умолчанию он обмазывает запрос своей реализацией днс-а с явно указанными гугло-днсами:

Снимок экрана (101).png

И внезапно, вы можете получить ощутимые потери производительности из-за того, что внезапно ваши запросы
а) Резолвятся на наружном сервере, до которого нужно сходить
б) Резолвятся в публичный ИП, вместо того, что бы идти напрямую (а в случае с Амазоном, это еще и может денег стоить, например)

Установка dnsmasq и указание локалхоста для днс резолвинга добавило +50% rps :-/

Проблема узковатая, но вдруг кому пригодится.
 

fixxxer

К.О.
Партнер клуба
В принципе, логично, системный gethostbyname() блокирующий, для асинхронщины всегда нужна своя реализация резолвера (или тредпул, что в случае с php, ясное дело, отпадает). По той же причине в конфигурации nginx надо указывать resolver в явном виде для проксирования по hostname.

Другое дело, что неявный дефолт 8.8.8.8 это несколько странно. Видимо, разработчики решили, что лучше пусть хоть как-то работает, чем кидает исключение.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
В принципе, логично
Другое дело, что неявный дефолт 8.8.8.8 это несколько странно. Видимо, разработчики решили, что лучше пусть хоть как-то работает, чем кидает исключение.
Ну вот у меня в целом такие-же ощущения. Но по-хорошему, это поведение стоило в документации хотя бы обозначить.
 

AnrDaemon

Продвинутый новичок
Системный gethostbyname() не только блокирующий, но и кеширующий.
Вы ПРАВДА хотите писать велосипед, когда у вас под рукой мотоцикл с турбонаддувом?
 

fixxxer

К.О.
Партнер клуба
С чего бы http-клиенту общего назначения делать предположения о неуникальности hostname-ов в запросах?

Если IP можно отрезолвить заранее - логично так и сделать (как это делает nginx при парсинге конфигурации, если hostname указан явно, а не извлекается из переменных), а заголовок Host передать отдельно. В случае с амазонами, кстати, в ряде случаев IP может поменяться в любой момент.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Системный gethostbyname() не только блокирующий, но и кеширующий.
Вы ПРАВДА хотите писать велосипед, когда у вас под рукой мотоцикл с турбонаддувом?
Сдается мне, в условиях асинхронной обработки от такого мотоцикла можно потерять куда больше rps.

Проверять это я конечно не буду. ©
 

MiksIr

miksir@home:~$
Системный gethostbyname() не только блокирующий, но и кеширующий.
Вы ПРАВДА хотите писать велосипед, когда у вас под рукой мотоцикл с турбонаддувом?
Во-первых, при написании мультиплексирующего демона после слов "блокирующий" можно ставить минус и точку. Все-равно, что он там кеширующий или нет.
Во-вторых, он не кеширующий. Кеширование gethostbyname запросов осуществляется отдельно посредством nscd демона. Ну и ничего не мешает использовать этот демон своей реализации ресолвера.
 

fixxxer

К.О.
Партнер клуба
при написании мультиплексирующего демона после слов "блокирующий" можно ставить минус и точку
Ну, с поправкой на file IO. Но тут поправка вынужденная: с одной стороны, блокировка короткая, с другой стороны, async file i/o в самой распространенной ОС находится в состоянии "толком не работает" уже много лет.
 

MiksIr

miksir@home:~$
Ну, с поправкой на file IO. Но тут поправка вынужденная: с одной стороны, блокировка короткая, с другой стороны, async file i/o в самой распространенной ОС находится в состоянии "толком не работает" уже много лет.
Ну тут треды только, пожалуй. Есть libuv которая прячет это под капотом. Вроде reactphp учат с php-uv работать...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
был у меня в том году случай: многопоточное приложение на С, DNS-балансировщик в локалке, и бага;
экспериментально доказал, что в локалке теряются пакеты, а потоки, соответственно, подвисают в ожидании резолва - в отличие от tcp, у DNS надо самостоятельно следить за таймаутом
 
Сверху