Выбор ответа Senior Event loop и libuv обновлено

Что на самом деле идёт в пул потоков libuv

Вопрос

Сервис делает много HTTP-запросов к внешним API по hostname и параллельно хеширует пароли через crypto.scrypt. Под нагрузкой растут задержки DNS. Какое объяснение верное?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: dns.lookup и crypto.scrypt делят пул libuv из 4 потоков. Сетевой ввод-вывод (сокеты) libuv обслуживает через механизмы ОС (epoll, kqueue, IOCP) без пула потоков.

Варианты ответа

  1. dns.lookup и crypto.scrypt делят пул libuv из 4 потоковправильный ответ
  2. Сокеты обслуживаются пулом потоков, и HTTP конкурирует с crypto
  3. DNS-запросы выполняются в основном потоке, и scrypt блокирует его
  4. Пул потоков сам растёт под нагрузкой, значит, виноват внешний DNS

Разбор

Сетевой ввод-вывод (сокеты) libuv обслуживает через механизмы ОС (epoll, kqueue, IOCP) без пула потоков. В пул идут операции без асинхронного API в ОС: fs, dns.lookup (через getaddrinfo), асинхронные crypto.pbkdf2/scrypt/randomBytes, zlib. Пул фиксированный, по умолчанию 4 потока (UV_THREADPOOL_SIZE, задаётся до первого использования), сам он не растёт.

Лечение: увеличить UV_THREADPOOL_SIZE, кешировать DNS или использовать dns.resolve* (c-ares, без пула), вынести хеширование в отдельные воркеры. scrypt в асинхронной версии основной поток не блокирует.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме