intermediate
libuv basics
Понимайте libuv как portable eventing layer для file I/O, networking, timers и worker pool.
libuv — C-библиотека, через которую Node ведёт event loop, таймеры, асинхронный файловый I/O, DNS, сеть и фиксированный thread pool (по умолчанию 4 потока, настраивается через `UV_THREADPOOL_SIZE`).
| Тип работы | Обычная обработка | |-----------|------------------| | TCP/UDP сокеты | OS readiness API (epoll/kqueue/IOCP) на главном цикле | | Файловая система (async API) | Thread pool | | DNS lookup (`dns.lookup`) | Thread pool | | Крипто (`pbkdf2`, часть шифров) | Thread pool | | `fs.readFile` / `fs.writeFile` | Thread pool |
Thread pool — общий ресурс процесса. Тяжёлое crypto или диск при множестве запросов встаёт в очередь за лимитом пула, хотя JavaScript выглядит «неблокирующим».
// Занимает поток пула до завершения — задержит чужой fs/crypto
const hash = await promisify(crypto.pbkdf2)(password, salt, 100000, 64, 'sha512');
На интервью: что принадлежит libuv, а что V8; почему часть «async» API всё равно использует потоки; когда исчерпание пула становится узким местом.
Типовые ошибки: считать, что весь I/O бесплатен для main thread; менять `UV_THREADPOOL_SIZE` без измерений; путать `dns.lookup` (пул) и `dns.resolve` (сеть, другой путь).
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Назовите зоны ответственности libuv.
- Перечислите API, идущие в thread pool.
- Объясните размер пула как лимит параллелизма.
- Свяжите насыщение пула с tail latency.