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.