【问题标题】:how to get a child process memory usage in node.js?如何在 node.js 中获取子进程内存使用情况?
【发布时间】:2012-05-24 02:39:45
【问题描述】:

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

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

【问题讨论】:

    标签: node.js memory-management child-process


    【解决方案1】:

    获取孩子的 memoryUsage 最简单的方法是安装 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
    }
    */
    

    如果您想获得多个孩子的 memoryUsage,您需要更改 child.pid for and array [child.pid,child2.pid], function (err, stats) ...

    【讨论】:

    • 其实这种方法没有考虑子进程自己创建进程的情况。在这种情况下,最好使用 `pidusage-tree。
    • 这是限制子进程资源使用的合适方法吗?例如,如果某个子进程内存使用量达到 x 字节,那么我想停止该进程。
    • 这取决于你在做什么,因为如果你有一个流程来完成一个简单的任务,那么你就不需要这样做,但是如果你有一个 web 服务器,例如接收一个很多请求,而您想分配特定数量的 内存或 CPU,您可以这样做,没有什么能阻止您这样做。
    【解决方案2】:

    我们可以使用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');
    

    child.js 中可能看起来像这样

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

    【讨论】:

    • 这仅在子节点也是 Node 脚本 (fork) 时有效,但 OP 询问了任意进程 (spawn)。
    【解决方案3】:

    如果您在 unix 环境中,您可以使用ps(使用/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));
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2010-10-19
      • 2017-05-03
      • 1970-01-01
      • 2023-03-27
      • 2012-02-11
      • 2011-11-05
      • 2015-03-11
      相关资源
      最近更新 更多