Что на самом деле идёт в пул потоков libuv
Вопрос
Сервис делает много HTTP-запросов к внешним API по hostname и параллельно хеширует пароли через crypto.scrypt. Под нагрузкой растут задержки DNS. Какое объяснение верное?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
dns.lookupиcrypto.scryptделят пул libuv из 4 потоковправильный ответ- Сокеты обслуживаются пулом потоков, и HTTP конкурирует с crypto
- DNS-запросы выполняются в основном потоке, и scrypt блокирует его
- Пул потоков сам растёт под нагрузкой, значит, виноват внешний 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 ошибок.
Термины по теме
Ещё по теме «Event loop и libuv»
- Тяжёлый цикл без блокировки event loop
- Код-ревью: что блокирует event loop
- Что блокирует event loop
- Объясни event loop в Node.js
- setImmediate и setTimeout внутри I/O
- setTimeout(0) против setImmediate на верхнем уровне
- Что такое libuv
- Рекурсивный process.nextTick