【问题标题】:NodeJs: running spawn process memory usage is growingNodeJs:运行生成进程内存使用量正在增长
【发布时间】:2014-07-12 03:01:11
【问题描述】:

我使用以下代码在 nodejs 服务器的 CLI 环境中运行 PHP 脚本。 该脚本将 stdin 中的数据执行计算并将其他数据返回到 stdout。

问题在于使用 child_process.spawn 运行脚本并通过管道连接到增加内存使用量。所以我必须每隔一段时间重新启动节点应用程序。

我想保持 RAM 的使用不变。

在示例中,我使用 cat 命令来模拟我的 php 脚本,但问题仍然存在,内存使用增加与 setInterval 中的周期数成正比。 我使用 setInterval 来模拟脚本的周期执行。

var spawn = require('child_process').spawn;

var php = spawn('cat');

var i = 0;
setInterval(function() {
    php.stdin.write(++i);
},10);

案例#2 即使有以下情况,我也看到了内存泄漏:

var spawn = require('child_process').spawn;

var php = spawn('cat');
php.stdout.resume();
php.stderr.resume();

var i = 0;
setInterval(function() {
  gc && gc();
  console.log(process.memoryUsage());
  console.log(php.stdin.write(''+(++i)));
},1000);

执行:node --expose-gc --always-compact foo.js

已针对 v0.10.28 节点测试

【问题讨论】:

    标签: node.js memory process pipe spawn


    【解决方案1】:

    尝试增加间隔。 php.stdin.write() 很可能在某个时候返回 false,这表明正在缓冲,因为子进程无法跟上。如果 write() 确实返回 false,您通常应该停止写入,直到看到 php.stdin 上发出的 'drain' 事件。

    【讨论】:

    • 我使用 setInterval 仅用于模拟脚本的周期执行,但问题仍然存在
    • 无论哪种方式,您实际上是在检查write() 的返回值还是在管道而不是手动编写或?
    • 你可以试试代码,在linux上使用top或htop你可以验证节点进程的内存是否在增长
    • 你可能想在节点的 github 问题跟踪器上报告问题。
    • 好主意...我在这里尝试过:github.com/joyent/node/issues/7666 但问题仍然存在..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多