robot测试内存泄露问题

我用1000个账号测试登陆,登陆代码如下:

Handler.prototype.login_test = function( msg, session, next ) {
    var self = this;
    this.app.get( 'dbclient' ).select( 'role', 'username="' + msg.username + '"', 'role_id', function( err, res ) {
        if( err ) {
            logger.error( 'function[login-1] ', err );
            next( null, { code : 500 } );
            return;
        }
        var player = res[ 0 ];
        var data = { code : 200 };
        session.on( 'closed', on_user_leave.bind( null, self.app ) );
        session.pushAll( function() {
            session.bind( player.role_id, function() {
                next( null, data );
            });
        });
    });
};

玩家离开时的代码:

var on_user_leave = function( app, session, reason ) {
    /* .................. */
    app.rpc.chat.chatRemote.deleteOnlineData( null, session.uid, function( err, res ) {});
    app.rpc.pvp.pvpRemote.clear_data_by_uid( null, session.uid, function( err, res ) {});
};

测试方法:
1000个用户登陆,然后离开
测试结果:
稳定时:1000个玩家登陆稳定后connector内存增长到100M左右。chat和pvp大概在40M左右。
断开后:
问题一:1000个玩家离开后,connector内存没降低,维持在100M左右
问题二:chat服务器和pvp服务器内存突然增加到130M

PS:我把那两行rpc调用注释掉就没有有“问题二”

我看见之前有人说过,rpc调用不传callback会导致内存泄露,问题是我传了callback为什么内存还是泄露?再就是connetor内存不降是怎么回事?

附上PvpRemote中的代码:

PvpRemote.prototype.clear_data_by_uid = function( uid, cb ) {
    if( this.app.get( 'PlayerList' )[ uid ] ) {
        delete( this.app.get( 'PlayerList' )[ uid ] );
    }
    cb( null, null );
};

我的pomelo版本是1.0.2,问题很严重,我测试代码比较简单,应该不是我代码的问题。

附上一张内存前后对比图:
1000个用户登陆稳定后:

serverId    serverType pid   rss(M) heapTotal(M) heapUsed(M) uptime(m) 
chat_server chat       19543 34.98  30.68        16.19       5.52      
con_1       connector  19538 109.14 89.83        62.27       5.52        
gate_server gate       19536 41.65  33.62        22.00       5.52           
master      master     19530 27.36  20.71        14.01       5.52      

1000个用户断开连接后:

serverId    serverType pid   rss(M) heapTotal(M) heapUsed(M) uptime(m) 
chat_server chat       21309 122.94 31.67        13.87       30.77     
con_1       connector  21304 112.04 90.89        64.00       30.78      
gate_server gate       21302 41.79  33.62        20.30       30.78         
master      master     21296 32.41  28.71        17.10       30.78     
标签:无
EarlyBird 在 2014-8-18 12:10发布
EarlyBird 在 2014-8-18 17:15重新编辑 分享到 weibo
3 回复
#1 EarlyBird 2014-8-18 15:20 回复

内存的增长都是rss(常驻内存),为什么会这样呢,麻烦pomelo童鞋解释下

#2 {5} qsonXu 2014-8-18 17:02 回复

兄弟,你能把内存dump出来,分析一下。

EarlyBird 2014-8-18 17:05 回复

dump出来的是堆内存,现在出问题的都是rss(常驻内存),所以dunp没用的,或者请问你有什么办法把rss的内存dump出来不呢?

qsonXu 2014-8-18 17:06 回复

@EarlyBird 一般做不同时间戳的dump,然后对比对像内存使用进行比较分析。

EarlyBird 2014-8-18 17:10 回复

@qsonXu 问题是我堆内存没问题哦,泄露的不是在堆内存上,我测试代码很简单,没有自己new出来太多的对象。我的问题是出在类似于静态变量或者常量这样的内存区,我不太了解v8是怎么处理的,所以无从下手

qsonXu 2014-8-18 17:14 回复

@EarlyBird 那你这样子做测试,你分别做几次1000次地登入离开。中间服务器不重启,看看内存是否增加长,如果增长就真的内存漏露了,如果没有增长,那就调用node-gc的回收参数。

EarlyBird 2014-8-18 17:16 回复

@qsonXu 好的,谢谢你的建议,我多测试下

#3 {1} xiecc 2014-8-18 17:20 回复

你测一下10000或100000个人的情况, 现在这个情况不算内存泄露

EarlyBird 2014-8-18 17:27 回复

明白,我测试的方式有点简单粗暴了点,我再去测试测试

回到顶部