如何在node.js中获取子进程内存使用?

CAL*_* TZ 7 memory-management child-process node.js

我知道有一个api process.memoryUsage()来获取当前进程中的内存使用情况.

但是,如果我通过child_process.spawn(command,[args],[options])启动一个新的子进程,并且我得到一个ChildProcess对象,那么如何获得新的进程内存使用?

小智 8

获取孩子记忆的最简单方法是安装pidusage

链接:https : //www.npmjs.com/package/pidusage

在控制台写这个来安装它:

在 Windows 命令中: npm i pidusage --save
在 Mac 命令中: sudo npm i pidusage --save

let pidusage = require('pidusage');

const cp = require("child_process");

const child = cp.spawn('ls', ['-lh', '/usr']);

pidusage(child.pid, function (err, stats) {

console.log(stats);

});
/*
Output: 
{
   cpu: 10.0,            // percentage (from 0 to 100*vcore)
   memory: 357306368,    // bytes
   ppid: 312,            // PPID
   pid: 727,             // PID
   ctime: 867000,        // ms user + system time
   elapsed: 6650000,     // ms since the start of the process
   timestamp: 864000000  // ms since epoch
}
*/
Run Code Online (Sandbox Code Playgroud)

如果你想获得多个孩子的内存使用情况,你需要改变 child.pid for 和 array [child.pid,child2.pid], function (err, stats) ...

  • 实际上,这种方法没有考虑子进程本身创建进程的情况。在这种情况下,最好使用“pidusage-tree”。 (2认同)

小智 5

我们可以使用 nodejs ipc 协议获得多平台解决方案。您只需要设置事件以从父进程请求内存使用,然后process.memoryUsage()从生成的子进程发送。

父.js

var ChildProcess = require('child_process'),
    child = ChildProcess.fork('./child.js');

child.on('message', function(payload){
    console.log(payload.memUsage);
});

child.send('get_mem_usage');
Run Code Online (Sandbox Code Playgroud)

child.js它看起来像这样

process.on('message', function(msg){
    if(msg === 'get_mem_usage'){
         process.send({memUsage: process.memoryUsage()});
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 仅当子脚本也是 Node 脚本(“fork”),但 OP 询问任意进程(“spawn”)时,这才有效。 (2认同)

Far*_*hat 1

如果你在unix环境下,你可以使用ps( usesunderlying)。/proc/<pid>/stat这是一个例子:

// Spawn a node process
var child_process = require('child_process');
var child = child_process.spawn('node');

// Now get its pid.
child_process.exec('ps -p' + child.pid + ' -o vsize=',  function (err, stdout, stderr) {
  err = err || stderr;
  if (err) {
      return console.log('BAD Luck buddy: ', err);
  }
  console.log('YOU\'ve done it', parseInt(stdout, 10));
});
Run Code Online (Sandbox Code Playgroud)

这是使用 ubuntu 12.04 和 OS X lion 进行测试的。虽然不认为它会在 Windows 中工作。