PassFront
  1. PassFront
  2. База знаний
  3. Производительность и production

Как не блокировать Event Loop в Node.js?

Производительность и production

Event Loop блокируется, когда синхронный код выполняется долго: пока он работает, сервер не обрабатывает остальные запросы.

Типичные причины

  • Большие циклы и вложенные вычисления в обработчике запроса.
  • JSON.parse или JSON.stringify огромных объектов.
  • Синхронные API: fs.readFileSync, crypto.pbkdf2Sync.
  • Катастрофическое backtracking в регулярных выражениях.

Что делать

  • Использовать асинхронные версии функций и потоки.
  • Тяжёлые вычисления выносить в worker_threads или в отдельный сервис.
  • Большие списки обрабатывать порциями, отдавая управление через setImmediate.
  • Измерять задержку цикла: perf_hooks.monitorEventLoopDelay().
import { monitorEventLoopDelay } from 'node:perf_hooks';

const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
setInterval(() => console.log('p99 ms:', h.percentile(99) / 1e6), 5000);

Коротко для собеседования

Любая синхронная работа дольше нескольких миллисекунд мешает всем клиентам. Делаем её асинхронной, выносим в воркер или режем на части и следим за задержкой цикла.

Другие вопросы раздела