socket.io + node.js 的内存泄漏

2024-01-08

我的 Node.js 应用程序似乎存在内存泄漏。我很快就构建了它,而且我的 JavaScript 不太强大,所以这可能很容易。

我已经对它做了一些堆转储,它是字符串object?内存泄漏,速度约为每 5 分钟 1MB。我扩展了String,它实际上是String.Array?

Heap stack: enter image description here

#!/usr/local/bin/node

var port = 8081;

var io = require('socket.io').listen(port),
sys = require('sys'),
daemon = require('daemon'),
mysql = require('mysql-libmysqlclient');

var updateq = "SELECT 1=1";
var countq = "SELECT 2=2";

io.set('log level', 2);


process.on('uncaughtException', function(err) {
  console.log(err);
});

var connections = 0;

var conn = mysql.createConnectionSync();
dbconnect();

io.sockets.on('connection', function(client){ 
  connections++;
  client.on('disconnect', function(){ connections--;  }) 
});

process.on('exit', function () {
    console.log('Exiting');
    dbdisconnect();
});

function dbdisconnect() {
     conn.closeSync();
}

function dbconnect() {
    conn.connectSync('leet.hacker.org','user','password');
}


function update() {
    if (connections == 0)
        return;
    conn.query(updateq, function (err, res) {
      if (err) {
        dbdisconnect();
        dbconnect();
        return;
      }
      res.fetchAll(function (err, rows) {
        if (err) {
          throw err;
        }
        io.sockets.json.send(rows);
      });
    });
}

function totals() {
    if (connections == 0)
        return;
        conn.query(countq, function (err, res) {
          if (err) {
        // Chances are that the server has just disconnected, lets try reconnecting
        dbdisconnect();
        dbconnect();
            throw err;
          }
          res.fetchAll(function (err, rows) {
            if (err) {
              throw err;
            }
        io.sockets.json.send(rows);
          });
        });

}

setInterval(update, 250);
setInterval(totals,1000);

setInterval(function() {
console.log("Number of connections: " + connections);
},1800000);



  daemon.daemonize('/var/log/epiclog.log', '/var/run/mything.pid', function (err, pid) {
    // We are now in the daemon process
    if (err) return sys.puts('Error starting daemon: ' + err);

    sys.puts('Daemon started successfully with pid: ' + pid);
  });

当前版本

function totals() {

        if (connections > 0)
        {
                var q = "SELECT query FROM table";

            db.query(q, function (err, results, fields) {
            if (err) {
                    console.error(err);
                    return false;
            }

            for (var row in results)
            {
                    io.sockets.send("{ ID: '" + results[row].ID + "', event: '" + results[row].event + "', free: '" + results[row].free + "', total: '" + results[row].total + "', state: '" + results[row]$
                    row = null;
            }


            results = null;
            fields = null;
            err = null;
            q = null;
            });
    }
}

仍然泄漏内存,但似乎仅在以下条件下发生:

  • 从启动开始,没有客户端 -> 很好
  • 第一个客户端连接 -> 良好
  • 第二个客户端(即使第一个客户端断开连接并重新连接)-> 内存泄漏
  • 停止所有连接 -> 好
  • 1 个新连接(连接 = 1)-> 内存泄漏

帮自己一个忙并使用节点mysql https://github.com/felixge/node-mysql,它是一个纯 JavaScript 的 mysql 客户端,而且速度很快。除此之外,您应该使用异步代码来阻止 IO 在工作时被阻塞。使用async https://github.com/caolan/async图书馆将在这里为您提供帮助。它具有瀑布回调传递的代码等。

至于你的内存泄漏,它可能不是socket.io,虽然我已经几个月没有使用它了,但我有数千个并发连接并且没有泄漏内存,而且我的代码也不是最好的。

然而,有两件事。首先,您的代码无法读取。我建议考虑正确格式化代码(我为每个缩进使用两个空格,但有些人使用四个空格)。其次,每半小时打印一次连接数似乎有点愚蠢,当你可以这样做时:

setInterval(function() {
  process.stdout.write('Current connections: ' + connections + '     \r');
}, 1000);

The \r将导致该行被读回到该行的开头并覆盖那里的字符,这将替换该行并且不会产生大量的回滚。如果您选择将调试详细信息放入日志记录中,这将有助于调试。

您还可以使用process.memoryUsage()用于快速检查内存使用情况(或节点认为您正在使用多少内存)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io + node.js 的内存泄漏 的相关文章

随机推荐

  • 找不到springframework的标签库描述符

    我试图遵循 spring JPetStore 的示例 但在引用 lib 标签 spring 的行中的 JSP 页面中出现错误 找不到 http www springframework org tags 的标签库描述符 这个图书馆的网址是什么
  • 将 Javascript 对象转换为代理(而不是其引用)

    我可以获取一个 Javascript 对象o并从中创建一个新的 Proxy 对象 let p new Proxy object 但是有没有办法改变现有对象引用以跟踪原始对象的更改 特别是 有没有办法可以从外部源跟踪对象上新键的添加 代理规范
  • 在 pg-promise 中返回

    我使用所有查询创建了一个单独的文件pg promise节点模块 虽然对于大多数人来说我只是使用req res在查询之后 我想返回一个值 这是行不通的 它返回undefined passportLogin email gt db one SE
  • Interface Builder 项到底什么时候被实例化?

    假设我从 XCode4 中的模板创建一个基于导航的应用程序 那么 MainWindow xib 中将有一个导航控制器 它有一个子 RootViewController 到底什么时候会 RootViewController 的实例被创建吗 该
  • 使最后一个内联列表项扩展容器的剩余宽度

    我正在寻找一种方法来使最后一个内联列表项扩展其容器的其余部分 所以我有这样的东西
  • 使编译器/优化器能够制作更快的程序的编码实践

    许多年前 C 编译器还不是特别聪明 作为一种解决方法 K R 发明了register关键字 提示编译器 将此变量保留在内部寄存器中也许是个好主意 他们还制作了三级运算符来帮助生成更好的代码 随着时间的推移 编译器逐渐成熟 他们变得非常聪明
  • 数据表固定列(仅限右侧)问题

    我正在使用 JQuery Datatable 当我使用固定列时遇到了问题 它已经显示了两次我的固定栏 https i stack imgur com qlSCh png 我正在使用服务器端处理 这是我的代码 dataTable table
  • jQuery 在传递 POST 数据时在新选项卡中打开页面

    我有一个名为 list 的 JavaScript 变量 我需要将其作为 POST 数据发送到另一个页面并在新选项卡中打开该页面 存在 POST 数据 这段代码 jQuery post datadestination php list 发送数
  • Softmax 交叉熵损失爆炸

    我正在创建一个用于逐像素分类的深度卷积神经网络 我正在使用 adam 优化器 softmax 和交叉熵 Github 存储库 https github com dhasl002 Research DeepLearning I asked a
  • 如何使用 rspec 测试具有嵌套路由的控制器

    我使用 InherritedResource 创建控制器 class AppsController lt InheritedResources Base belongs to company Devise before filter log
  • 如何使用RxJava返回值?

    让我们考虑一下这种情况 我们有一些类 它有一个返回某个值的方法 public class Foo Observer
  • Netbeans 7.0 的 UML 插件?

    我如何安装 添加 UML 插件到 Netbeans 7 0 我可以找到多种安装插件的方法 但仅限于 6 9 的早期版本 http forums netbeans org topic28035 html http forums netbean
  • OS X Mavericks 上有 PostgreSQL 吗?

    我知道 OS X Mountain Lion 上安装了一个版本的 PostgreSQL 如果你想使用这个数据库引擎 你必须安装一个新版本并进行一些更改 http nextmarvel net blog 2011 09 brew instal
  • 对动态添加的文本使用内联 CKEditor

    我正在构建一个网络应用程序 它使用 javascript 动态地将元素添加到页面 然后可以使用进行编辑contentEditable true and CKEditor 目前 如果我向页面添加一个元素contentEditable true
  • 不使用 jQuery 添加到 DOM

    这应该很简单 但事实并非如此 document getElementsByTagName body 0 document createTextNode document createElement div some HTML div 它创建
  • 类名宏[重复]

    这个问题在这里已经有答案了 可能的重复 CLASSC 中的宏 https stackoverflow com questions 1666802 class macro in c 你好 有没有什么方法可以用宏来获取类的名称 比如 功能 对于
  • 无法覆盖 __call__ 的实现

    以此为例 class Foo object def init self msg self msg msg def call self return self msg foo Foo hello print foo Prints hello
  • 使用 Telnet 或 SSH 与 Perl 从本地计算机在远程计算机上运行 perl 脚本

    我想使用 telnet 或 ssh 在远程计算机上运行 Perl 脚本 该脚本位于我的本地主机上 如何执行此操作 有人可以帮我解决这个问题吗 如果由于某种原因您不想将脚本复制到远程主机然后运行它 您可以通过 stdin 将脚本发送到 Per
  • .NET 3.5 中的 FormsAuthentication.Timeout.TotalMinutes

    我刚刚使用 FormsAuthentication 我想要 Web 配置中表单身份验证标记的超时属性值 在 4 0 中 我们可以通过 FormsAuthentication Timeout TotalMinutes 获取此信息 参考 For
  • socket.io + node.js 的内存泄漏

    我的 Node js 应用程序似乎存在内存泄漏 我很快就构建了它 而且我的 JavaScript 不太强大 所以这可能很容易 我已经对它做了一些堆转储 它是字符串object 内存泄漏 速度约为每 5 分钟 1MB 我扩展了String 它