> Как решать проблему нагрузки на CPU в сервисе (JavaScript)

Уровень: senior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы

Компании: ЭНИРАН

Стек: Node.js, JavaScript

> Пример ответа

Проблема нагрузки на CPU в Node.js-сервисе чаще всего связана с блокирующими операциями в event loop. Основные шаги решения:

  1. Диагностика: Используйте встроенный профайлер (node --prof) или инструменты вроде clinic.js для выявления «горячих точек». Проверьте, не выполняются ли синхронные тяжелые вычисления (например, парсинг больших JSON, криптография, обработка изображений) в основном потоке.

  2. Асинхронная обработка:

    • Замените синхронные методы на асинхронные: fs.readFileSyncfs.promises.readFile, JSON.parse больших данных - разбивайте на чанки или используйте стримы.

    • Для CPU-интенсивных задач (хеширование, сортировка) выносите их в отдельные worker threads (worker_threads) или child processes. Пример:

      JAVASCRIPT
      const { Worker } = require('worker_threads');
      const worker = new Worker('./heavy-task.js');
      worker.postMessage(data);
      worker.on('message', result => { /* обработка */ });
  3. Оптимизация алгоритмов: Проверьте, нет ли лишних циклов, рекурсий или неэффективных структур данных (например, for...in вместо for...of). Используйте Map/Set вместо массивов для частого поиска.

  4. Балансировка нагрузки: Если проблема в пиковых запросах, добавьте кластеризацию (cluster module) или используйте PM2 с режимом cluster. Это распределит запросы по ядрам CPU.

  5. Мониторинг и лимиты: Настройте APM (например, New Relic, Datadog) для отслеживания event loop lag. Ограничьте количество одновременных запросов через http.Server.maxConnections или используйте очередь (Bull/BullMQ) для фоновых задач.

  6. Кэширование: Если нагрузка вызвана повторяющимися вычислениями, кэшируйте результаты (Redis, in-memory cache с TTL).

Пример типичной ошибки - синхронный crypto.pbkdf2Sync в обработчике запроса. Решение - заменить на асинхронный crypto.pbkdf2 или вынести в worker.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью