CNode

内存一直涨,并且下不去。。。

Bbeiyio发布于13 年前最后回复13 年前33 回复10209 浏览0 收藏

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

查看回复

回复 (33)

L
leizongmin#1·13 年前

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

B
beiyio#2·13 年前
 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);
}

}

B
beiyio#4·13 年前
引用 leizongmin上代码,上代码,上代码。。。。。。。。。。 应该是内存泄漏了吧

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

B
beiyio#6·13 年前

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

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

P
pavelhurt#7·13 年前

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

B
beiyio#8·13 年前
引用 pavelhurt每次调用GameMain(aPort),都会创建新的进程。 而断开连接时没有kill掉。

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

B
beiyio#10·13 年前
P
pavelhurt#13·13 年前
引用 pavelhurt每次调用GameMain(aPort),都会创建新的进程。 而断开连接时没有kill掉。

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

B
beiyio#14·13 年前
L
leizongmin#15·13 年前

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

Z
zztczcx#16·13 年前

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

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

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

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

B
beiyio#18·13 年前

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

Z
zztczcx#21·13 年前
引用 zztczcx单纯的监听 应该没有什么问题。 不知道你的 子进程在做什么? 因为我最近也有用cluser,几十万连接,内存也没有这么大。

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

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

B
beiyio#25·13 年前

昨天晚上挂了一夜,开了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 关闭连接后依旧保持这些内存无变化。

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

B
beiyio#26·13 年前

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

B
beiyio#28·13 年前

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

S
seasonx4#29·13 年前

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

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

I
inetfuture#30·13 年前

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

参与回复
登录后即可参与回复。登录