Запустить функцию прямо перед Nodejs сбоев из-за OOM - PullRequest
0 голосов
/ 21 июня 2020

Можно ли заставить приложение Node.js запускать функцию (т.е. отправлять вызов API) прямо перед тем, как оно выйдет из строя из-за OOM?

Я пытаюсь зарегистрировать временные метки сбоев OOM, но для этого требуется возможность запускать функцию прямо перед тем, как процесс будет остановлен. PM2 в настоящее время используется для управления этим процессом Node.js.

1 Ответ

1 голос
/ 21 июня 2020

Средний: обнаружение переполнения кучи на Node.js: JavaScript нехватка памяти

Использует модуль кластера. Разветвляет воркер, который при событии exit разветвляет другой воркер, который регистрирует:

total_heap_size: размер, выделенный V8 для кучи. Он может увеличиваться, если used_heap_size нужно больше. heap_size_limit: абсолютный предел размера, который не может превышать куча. например: max_old_space_size

Затем он завершает работу, порождает нового рабочего и снова запускает основную функцию. Это предотвращает сбой при нехватке памяти, поскольку он завершается до того, как сработает ошибка нехватки памяти, и порождает новый рабочий. Если вы по-прежнему хотите, чтобы он взломал sh, вы можете удалить process.exit().

heavyHeapConsumer - это демонстрационная функция, которая потребляет большой объем памяти.

const cluster = require('cluster');
const v8 = require('v8');

let heavyHeapConsumer = () => {
  let arrays = [];
  setInterval(() => {
    arrays.push(new Array(1000000));
  }, 100);
};

if (cluster.isMaster) {
  cluster.fork();
  cluster.on('exit', (deadWorker, code, signal) => {
    // Restart the worker
    let worker = cluster.fork();
    
    // Note the process IDs
    let newPID = worker.process.pid;
    let oldPID = deadWorker.process.pid;
    
    // Log the event
    console.log('worker ' + oldPID + ' died.');
    console.log('worker ' + newPID + ' born.');
  });
} else { // worker
  const initialStats = v8.getHeapStatistics();
  
  const totalHeapSizeThreshold = 
    initialStats.heap_size_limit * 85 / 100;
  console.log("totalHeapSizeThreshold: " + totalHeapSizeThreshold);
  
  let detectHeapOverflow = () => {
    let stats = v8.getHeapStatistics();
    
    console.log("total_heap_size: " + (stats.total_heap_size));
    
    if ((stats.total_heap_size) > totalHeapSizeThreshold) {
      process.exit();
    }
  };
  setInterval(detectHeapOverflow, 1000);
  
  // here goes the main logic
  heavyHeapConsumer();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...