在OOM导致Node.js崩溃之前立即运行函数

时间:2020-06-21 01:14:10

标签: javascript node.js out-of-memory v8 pm2

是否可以在Node.js应用因OOM崩溃之前立即强制运行一个函数(即发送API调用)?

我正在尝试记录OOM崩溃的时间戳,但这需要能够在进程终止之前运行功能。 PM2目前正用于管理此Node.js流程。

1 个答案:

答案 0 :(得分:1)

Medium: Detect heap overflow on Node.js: JavaScript heap out of memory

使用集群模块。派遣一个在exit事件上发生事件的工作人员,派生另一个记录的工作人员:

total_heap_size:已为堆分配的大小为V8。如果used_heap_size需要更多,则此数量可能会增加。 heap_size_limit:堆不能超过的绝对大小限制。例如:max_old_space_size

然后退出并产生一个新的worker,然后再次运行main函数。这样可以防止内存不足崩溃,因为它会在触发内存不足错误之前退出并生成新的worker。如果您仍然希望它崩溃,则可以删除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();
}