Ответ
В 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');
}); Ответ 18+ 🔞
А, слушай, тут про Event Loop в Node.js вопрос подъехал. Ну, в общем, если по-простому, то нормальная задержка у этой штуки — это где-то от 1 до 15 миллисекунд, понимаешь?
- 1-5 мс — это вообще красота, ёпта. Приложение летает, Event Loop шустрит как угорелый, всё по полочкам раскладывает. Идиллия, блядь.
- 5-15 мс — уже нормас, для большинства продакшенов сойдёт. Но глаз да глаз нужен, смотреть, чтобы вверх не попёрло.
- А вот если больше 15 мс — тут уже, бля, волнение ебать начинается. Это уже тревожный звоночек, что где-то в коде сидит какая-то манда с ушами и блокирует основной поток. То ли синхронная операция какая-то тяжёлая, то ли сборка мусора замучила, то ли ещё какая хитрая жопа притаилась.
Как эту задержку, блядь, измерить-то?
Ну, вот тебе простой способ, на коленке:
// Простой способ мониторинга
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. Доверия ебать ноль к тому, что ты на коленке слепишь.
- Смотри не на среднюю температуру по больнице, а на перцентили (p95, p99). Потому что кратковременные пики — это и есть самое страшное, они-то и покажут, где пиздопроебибна в коде.
- Основные причины, почему всё накрывается медным тазом:
- Синхронные операции с файлами (
fs.readFileSync) — классика жанра, убейся ап стену. - Долгие вычисления прямо в основном потоке. Ну, представим, ты там JSON размером с "Войну и мир" парсишь или криптографией занимаешься.
- Сборщик мусора (GC) совсем охренел от нехватки памяти и начал везде совать свой нос.
- Синхронные операции с файлами (
- Для глубокой диагностики можешь флаги запуска попробовать, типа
--trace-event-categories v8,node.perf, или модуль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');
});
Короче, следи за этим делом, а то будет тебе хиросима и нигерсраки в продакшене, когда всё ебанько встанет.