Ответ
В Node.js нормальная задержка Event Loop (latency) обычно находится в диапазоне 1-15 миллисекунд.
- 1-5 мс — отличная производительность, приложение не перегружено, Event Loop обрабатывает задачи быстро.
- 5-15 мс — приемлемые значения для большинства продакшн-нагрузок, но стоит мониторить тренд.
- >15 мс — тревожный сигнал: возможны блокировки Event Loop из-за синхронного CPU-интенсивного кода, долгих операций в основном потоке или проблем с сборкой мусора.
Как измерить Event Loop Latency:
// Простой способ мониторинга
function monitorEventLoopLag() {
const start = process.hrtime.bigint();
setImmediate(() => {
const end = process.hrtime.bigint();
const latencyMs = Number(end - start) / 1_000_000; // наносекунды в миллисекунды
console.log(`Event Loop Latency: ${latencyMs.toFixed(2)}ms`);
if (latencyMs > 15) {
console.warn('⚠️ Высокая задержка Event Loop!');
}
});
}
// Запуск мониторинга каждую секунду
setInterval(monitorEventLoopLag, 1000);
Практические рекомендации:
- В продакшне используйте специализированные инструменты: Clinic.js, Node.js Performance Hooks или APM-решения (Datadog, New Relic).
- Смотрите на перцентили (p95, p99), а не на средние значения — кратковременные пики важнее.
- Основные причины высокой латентности:
- Синхронные файловые операции (
fs.readFileSync) - Долгие вычисления в основном потоке (JSON.parse больших объектов, криптография)
- Активная сборка мусора при нехватке памяти
- Синхронные файловые операции (
- Для диагностики используйте флаг
--trace-event-categories v8,node.perfили модульperf_hooks.
Пример с использованием perf_hooks:
const { performance, PerformanceObserver } = require('perf_hooks');
const obs = new PerformanceObserver((items) => {
items.getEntries().forEach((entry) => {
console.log(`${entry.name}: ${entry.duration.toFixed(2)}ms`);
});
});
obs.observe({ entryTypes: ['measure'] });
performance.mark('start');
setImmediate(() => {
performance.mark('end');
performance.measure('Event Loop Latency', 'start', 'end');
});