建议在Express应用程序查找内存泄漏?(Suggestions for Finding a Me

2019-11-03 19:21发布

我内置了快3.20的应用程序。 我把它启动和运行PM2。 看在PM2的内存使用情况,我看到它仅需要几个小时的使用成为> 500MB对于每个过程,在该点它开始有问题。

约90%我的应用程序接收到的请求是缩略图。 所以我猜测,内存泄漏是从提供缩略图给用户的我的代码部分的到来。

代码的工作方式,用户请求一定大小的图像。 该脚本检查是否该尺寸的图像缓​​存/文件夹已经存在。 如果是这样,它发送一个文件给客户端。 如果不是这样,它使用GraphicsMagick工具在缓存/文件夹中创建一个新的形象,从原始图像,然后将其发送。

我下面包括相关的代码。 谁能告诉我,如果我明明做错什么这里,这是造成东西挂在内存中?

在此先感谢您的帮助。

var fs = require( "graceful-fs" ),
    gm = require( "gm" );

function isOriginalNewer( orig, cache ) {
    return orig.ctime > cache.ctime ? true : false;
}

function checkIfCachedImageUpToDate( originalPath, cachePath, cb ) {
    fs.stat( originalPath, function( err, stat1 ) {
        if ( err ) return cb( err );
        fs.stat( cachePath, function( err, stat2 ) {
            if ( err ) return cb( err );
            if ( isOriginalNewer( stat1, stat2 ) ) {
                cb ( null, false );
            } else {
                cb( null, true );
            }
        });
    });
}

function createNewCachedImage( originalPath, cachePath, cacheSubDir, size, cb ) {
    fs.exists( "cache/" + cacheSubDir, function ( exists ) {
        if ( exists ) {
            gm( originalPath ).resize( size, null, "^" ).quality( 95 ).write( cachePath, cb );
        } else {
            fs.mkdir( "resources/cache/" + cacheSubDir, 0750, function() {
                gm( originalPath ).resize( size, null, "^" ).quality( 95 ).write( cachePath, cb );
            });
        }
    });
}

function checkIfCached( originalPath, cachePath, cb ) {
    fs.exists( cachePath, function( exists ){
        if ( exists ) {
            checkIfCachedImageUpToDate( originalPath, cachePath, function( err, isUpToDate ) {
                if ( err ) return cb( err );
                if ( isUpToDate ) cb( null, true );
                else cb( null, false );
            });
        } else cb( null, false );
    });
}

function getImagePath( filename, type, size, cb ) {
    var originalPath = "originals/" + filename,
        cacheFilename = hash.md5( originalPath ) + "." + size + ".jpg",
        cacheSubDir = cacheFilename.substr( 0,2 ),
        cachePath = "cache/" + cacheSubDir + "/" + cacheFilename;

    checkIfCached( originalPath, cachePath, function( err, isCached ) {
        if ( err ) return cb( err );
        if ( isCached ) {
            cb( null, cachePath );
        } else {
            fs.exists( originalPath, function( exists ) {
                if ( !exists ) return cb( "File Not Found " + originalPath );
                createNewCachedImage( originalPath, cachePath, cacheSubDir, size, function( err ) {
                    if ( err ) return cb( err );
                    cb( null, cachePath );
                });
            });
        }
    });
}

module.exports = function( app ){
    app.get( "/image/:filename/:size", isLoggedIn, function( req, res, next ){
        var p = sanitizeParams( req );
        getImagePath( p.filename, p.size, function( err, imagePath ){
            if ( err ) next( err );
            else res.sendfile( imagePath );
        });
    });
};
文章来源: Suggestions for Finding a Memory Leak in an Express Application?