← Назад к вопросам

Какой диапазон нормальных значений Event Loop Latency?

2.7 Senior🔥 102 комментариев
#Node.js и JavaScript#Кэширование и производительность

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Event Loop Latency — диапазон нормальных значений

Это важная метрика для production приложений. Неправильная интерпретация может привести к пропуску проблем.

Что такое Event Loop Latency

Это время ожидания задачи в очереди перед выполнением.

Диапазоны нормальных значений

Идеальное состояние:

  • 0-10 мс: отличная производительность

Приемлемое значение:

  • 10-50 мс: нормально для большинства приложений

Предупреждение:

  • 50-200 мс: начинаются проблемы с отзывчивостью

Критическое:

  • 200+ мс: серьёзная проблема, нужна оптимизация

Контекст имеет значение

High-frequency trading:

  • Норма: 1-5 мс
  • Максимум: 20 мс

API серверы (типичный случай):

  • Норма: 5-30 мс
  • Приемлемо: до 100 мс

Background workers:

  • Норма: 50-200 мс
  • Не критично: 500+ мс

Как измерить

Способ 1: clinic.js (лучший выбор)

clinic.js doctor -- node app.js

Способ 2: Простой мониторинг

let lastCheck = Date.now();
setInterval(() => {
  const now = Date.now();
  const latency = now - lastCheck - 1000;
  
  if (latency > 50) {
    console.warn(`Event Loop lag: ${latency}ms`);
  }
  
  lastCheck = now;
}, 1000);

Способ 3: npm пакет

npm install event-loop-monitor

Способ 4: Node.js встроенные инструменты

node --prof app.js
node --prof-process isolate-*.log | head -50

Типичные причины высокой latency

1. CPU-heavy операции

// Плохо — блокирует Event Loop
app.get('/compute', (req, res) => {
  const result = expensiveComputation();
  res.json(result);
});

// Хорошо — используем Worker Threads
const { Worker } = require('worker_threads');
app.get('/compute', (req, res) => {
  const worker = new Worker('./compute.js');
  worker.on('message', result => res.json(result));
});

2. Синхронные I/O операции

// Плохо
const data = fs.readFileSync('large-file.json');

// Хорошо
const data = await fs.promises.readFile('large-file.json');

3. Большие JSON парсирования

// Плохо
const hugeObject = JSON.parse(largeJsonString);

// Хорошо — парсируй потоком
const stream = fs.createReadStream('large.json');
const parser = JSONStream.parse();
stream.pipe(parser);

4. Неэффективные алгоритмы

// Плохо — O(n²)
for (let i = 0; i < items.length; i++) {
  for (let j = 0; j < items.length; j++) {
    // операция
  }
}

// Хорошо — эффективная структура
const map = new Map(items.map(i => [i.id, i]));

5. Много синхронных Promise callbacks

// Плохо
Promise.resolve()
  .then(() => heavyComputation())
  .then(() => anotherComputation())
  .then(() => ...);

// Хорошо
async function process() {
  await heavyComputation();
  await anotherComputation();
}

Продвинутый мониторинг

Используй APM (Production):

  • New Relic
  • DataDog
  • Prometheus + Grafana

Пример с Prometheus:

import { histogram } from 'prom-client';

const eventLoopLag = new histogram({
  name: 'nodejs_eventloop_lag_seconds',
  help: 'Event loop lag in seconds',
});

let lastCheck = Date.now();
setInterval(() => {
  const lag = Date.now() - lastCheck - 100;
  eventLoopLag.observe(lag / 1000);
  lastCheck = Date.now();
}, 100);

Пороги для alerts

Green (хорошо):

  • p50: < 10ms
  • p95: < 30ms
  • p99: < 50ms

Yellow (внимание):

  • p50: 10-30ms
  • p95: 30-100ms
  • p99: 50-200ms

Red (срочно):

  • p50: > 30ms
  • p95: > 100ms
  • p99: > 200ms

Что делать если latency высокая

1. Профилируй с Clinic.js

clinic.js doctor -- node app.js

2. CPU profiles

node --prof app.js
node --prof-process isolate-*.log > profile.txt

3. Memory leaks

node --max-old-space-size=4096 app.js

4. Зависимости

npm audit
npm outdated

5. Clustering

import { createCluster } from 'cluster';
const cluster = createCluster();

if (cluster.isMaster) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  app.listen(3000);
}

Реальные примеры

Плохой сервер: Event Loop Latency: p50=150ms, p95=400ms, p99=1200ms

  • Пользователи ощущают задержки
  • Timeouts частые

Нормальный сервер: Event Loop Latency: p50=15ms, p95=50ms, p99=100ms

  • Пользователи не замечают задержек
  • API отзывчивый

Отличный сервер: Event Loop Latency: p50=3ms, p95=10ms, p99=20ms

  • Максимальная производительность
  • Готов к high-load

Вывод

Event Loop Latency — индикатор здоровья приложения. Следи за ним в production, оптимизируй при проблемах. Целевой диапазон для большинства приложений: 10-50ms. Всё выше требует внимания.

Какой диапазон нормальных значений Event Loop Latency? | PrepBro