内存一直涨,并且下不去。。。
发布于 2年前 作者 beiyio 1917 次浏览

创建了一个服务,功能只是坚挺了一个端口,我没10秒输出一次内存,发现内存不停的涨,偶尔下去一点点,后又上来了。不知道如何解决

34 回复

上代码,上代码,上代码。。。。。。。。。。 应该是内存泄漏了吧

 var mNet = require('net');
 var mCpuCount = require('os').cpus().length;
 var mCluster = require('cluster');
 var mLogo=require('../logs/log_system');
 var mPackageSystem=require('../shared/packageSystem');

 function GameMain(aPort){
     if(mCluster.isMaster==true){

      mNet.createServer(function(sock){
    
      console.log('连接');
    
     sock.on('data', function(data) {
        
     });
    
    /** 断开连接*/
    sock.on('close', function(data) {
         console.log("断开后");
    });
    
    sock.on('error', function(error) {
        
    });
    
}).listen(aPort);
console.log("game_server starting port:"+aPort);
}

}

其他的什么也没写

每次连接 、断开都会涨,断开后涨的特别的明显,始终下不去

在 sock.on('error’,function(error)) {

} 增加了sock.destroy(); 也不好用 T_T

每次调用GameMain(aPort),都会创建新的进程。 而断开连接时没有kill掉。

GameMain(aPort) 只调用了一次。 你说的kill是什么意思~

@beiyio Node.js和Socket.io版本是多少啊?

@pavelhurt node 的版本是 0.10.0 没有使用socket.io啊

@beiyio -_-! 。。。没仔细看require

@beiyio 应用场景是什么样的? 比如有多少个连接?每个连接写入数据量多大?

@pavelhurt 1000个连接 每个连接发送128k的数据

没看出来你那个代码有什么问题(你应该是删了一部分吧?)。 如果可以的话,尽量把没用的或者不必要的删掉,然后自己再测试一下。 还有你是怎么测试的,也应该说清楚。

单纯的监听 应该没有什么问题。 不知道你的 子进程在做什么?

因为我最近也有用cluser,几十万连接,内存也没有这么大。

代码是全的。 if(mCluster.isMaster==true)这个只是判断了一下,没有启动子进程。 测试过程就是 打开服务监听,启动的时候内存大概是16000左右,连接了1000个长连接,每个连接一直发送128K的数据,此时内存大概会在21000左右,断开连接后,内存还是21000左右,并没有随着我的断开连接恢复到16000左右

补充下,测试过程 if(mCluster.isMaster==true)这个只是判断了一下,没有启动子进程。 测试过程就是 打开服务监听,启动的时候内存大概是16000左右,连接了1000个长连接,每个连接一直发送128K的数据,此时内存大概会在21000左右,断开连接后,内存还是21000左右,并没有随着我的断开连接恢复到16000左右

几十万的内存大概是多少呢~

16000的单位是K吗,是rss还是heap? 如果是K,别纠结了,这是再正常不过。如果是M,呃呃呃…

@beiyio 我大概10万 用去 1个G。 感觉你这个 也还算正常。

不过 断了连接 ,内存不回收,这个真的是个问题。我也在找好的解决方法。

@shiedman 16000K不就是16M么

@zztczcx 难道你也有这个内存不回收的问题么

@beiyio @shiedman 想说如果是 16m 就是很正常的事情。。。。

不知道lz的测试方法是怎么样的,使用lz提供代码作为服务, 以下测试代码在测试过程中及中断测试后查看内存均有明显变化, 测试时每个连接发送消息大小512k,以下代码中消息数据请自行添加。

var mNet = require('net');
var tm = require('timers');

var times = 0;

// 每10毫秒增加一个连接,直到1000个
tm.setInterval(function () {
    times += 1;
    if(times < 1000) {
        var socket = new mNet.Socket();
        socket.connect(3000);
        var data = '请按需添加指定大小数据量';
        socket.write(data);
    }
}, 10);

// 每秒输出内存占用信息
tm.setInterval(function () {
    var mem = process.memoryUsage();
    console.log('phy mem: ' + mem.rss + '; heap: ' + mem.heapTotal + '(' + (Math.ceil(mem.heapUsed/mem.heapTotal*1000) / 10) + '%)');
}, 1000);

昨天晚上挂了一夜,开了3台机器,连接数加到了1500。 三台机器最少每秒发送28K数据,最大发送128K数据 数据如下 刚启动的时候 [2013-05-21 21:36:42.244] [INFO] log -23912448 然后每10秒log一次内存到在今天早上 [2013-05-22 07:06:31.561] [INFO] log - 58814464 [2013-05-22 07:06:41.560] [INFO] log - 58834944 [2013-05-22 07:06:51.563] [INFO] log - 58834944 [2013-05-22 07:07:01.559] [INFO] log - 58834944 [2013-05-22 07:07:11.571] [INFO] log - 58834944 [2013-05-22 07:07:21.570] [INFO] log - 58834944 关闭连接后依旧保持这些内存无变化。

也就是说,每次连接都会有内存释放不掉。这样反反复复的内存早晚要溢出的。

你销毁连接后,内存能回到为连接的时候的内存么

@beiyio 是的,不回收。5w 连接用去100M. 好头疼啊。

难道没人能给解决或者是解释一下么

到早上内存不是已经稳定了吗? 这时仍在1500个连接每秒28K的发包吧 很正常不是

V8在负载高的时候不爱执行GC的; 你说断开连接是不是断开了所有连接,让它0负载再观察一下。 不回收是不可能的

1500连接?再多点,上万,然后连接=》发数据=》断开=》连接=》发数据=》断开,如此往复多次…… 可以参考一下这个:http://cnodejs.org/topic/50e5900da7e6c6171a0159d7,我目前自己做长连接服务的测试结果大概是,每连接10K内存,没有内存泄露问题(你的代码也不像有。。)

你发的帖子,已经被删除了。

就是断开了所有的连接,0负载,可是还是下不去。

回到顶部