Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance expressjs压力测试_Performance_Node.js_Express - Fatal编程技术网

Performance expressjs压力测试

Performance expressjs压力测试,performance,node.js,express,Performance,Node.js,Express,我很难确定我的Web服务器(Cherokee)和expressjs网站之间的性能瓶颈 由于后期流量不断增加,我们开始不时地看到性能问题。因此,我设计了一个测试,看看该网站的1、2、3和4个实例的断点是什么,并对糟糕的性能感到震惊(以每秒5个的速度运行良好,以每秒10个的速度运行非常糟糕) 根据我的性能日志记录,完整的请求从开始到结束的时间在1000-4000毫秒之间,短时间后开始以线性趋势增加,因此在大约5分钟后,请求需要40000-600000毫秒。expressjs网站中的性能日志记录开始到

我很难确定我的Web服务器(Cherokee)和expressjs网站之间的性能瓶颈

由于后期流量不断增加,我们开始不时地看到性能问题。因此,我设计了一个测试,看看该网站的1、2、3和4个实例的断点是什么,并对糟糕的性能感到震惊(以每秒5个的速度运行良好,以每秒10个的速度运行非常糟糕)

根据我的性能日志记录,完整的请求从开始到结束的时间在1000-4000毫秒之间,短时间后开始以线性趋势增加,因此在大约5分钟后,请求需要40000-600000毫秒。expressjs网站中的性能日志记录开始到结束请求的时间在100-400毫秒之间(这段时间中90-390毫秒的大部分时间都花在等待Java API响应上)

我已经调查了连接池/max套接字,但是不知道如何使用express配置它,随着流量的不断增长,我开始感受到wesite性能每况愈下带来的压力

现在我有两个理论: 1.压力测试规范确实有问题; 2.无论是从压力测试应用程序发送请求还是在expressjs中,都有一个小的连接池

如果上述任何一个是真的,我不知道如何解决这些问题

--压力测试应用程序--

/*
*后压力测试
*/
var rest=要求(“restler”);
var u=需要(“../下划线”)。\uu;
var uuid=require(“节点guid”);
var fs=要求(“fs”);
var quoteContent=fs.readFileSync(uu dirname+“/data/quoteList.json”);
var quotes=JSON.parse(quoteContent).quotes;
var feedListContent=fs.readFileSync(uu dirname+“/data/feedList.json”);
var feeds=JSON.parse(feedListContent).feeds;
var feedLength=feeds.length;
var实验={“用户”:2,“频率”:1000};
//清除内存输出位
quoteContent=null;
feedListContent=null;
log(“并发用户:”,experience.users);
console.log(“每:”,(experiment.frequency/1000)+“秒”);
设定间隔(
函数()
{
var rndQuote;

对于(i=0;i您是否考虑过使用现有的压力测试工具,如or


我知道写自己的很有诱惑力,但是现有的是可靠的,你可以专注于修复你的站点而不是负载测试工具。

你有没有考虑过使用现有的压力测试工具,比如or

我知道写你自己的很有诱惑力,但是现有的都是可靠的,你可以专注于修复你的站点而不是你的负载测试工具

/*
 * POST stress testing
 */
var rest            = require( "restler");
var u               = require( "../underscore")._;
var uuid            = require( "node-guid" );
var fs              = require( "fs" );
var quoteContent    = fs.readFileSync( __dirname + "/data/quoteList.json" );
var quotes          = JSON.parse( quoteContent ).quotes;
var feedListContent = fs.readFileSync( __dirname + "/data/feedList.json" );
var feeds           = JSON.parse( feedListContent ).feeds;
var feedLength      = feeds.length;

var experiment      = { "users": 2, "frequency": 1000 };

// Clear memory out  bit
quoteContent        = null;
feedListContent     = null;

console.log("Concurrent users:", experiment.users);
console.log("Every          :", (experiment.frequency / 1000) + " seconds" );

setInterval(
    function()
        {
            var rndQuote;

            for(i=0;i<experiment.users;i++)
                {
                    delayPost( (experiment.frequency) / (experiment.users + 1) );
                }
        }
, experiment.frequency);

function delayPost( delay )
    {
        setTimeout(
            function()
                {
                    rndQuote = getRandomQuote();
                    postToRandomFeed( rndQuote );
                }
        , delay );
    }

function getRandomQuote()
    {
        var n = Math.floor( Math.random() * feedLength );
        return quotes[n];
    }

function postToRandomFeed( theQuote )
    {
        var n           = Math.floor( Math.random() * feedLength );
        var feed        = feeds[n];

        var     kloudId = feed.kloudId
            ,   feedId  = feed._id
            ,   uid     = feed.owner["$oid"]
            ,   url     = "quote://" + uuid.new() // Generate random URL
            ,   quote   = theQuote.quote
            ,   author  = theQuote.author;

        var     data    = { "url" : url, "title": quote, "text": quote, "tags": [author], "feeds": [ feedId ] }
            ,   postTo  = [ "http://127.0.0.1:4100/api/content/post/" + uid + "/wintermead" /*, "http://127.0.0.1:4101/api/content/post/" + uid + "/wintermead"*/ ]
            ,   ports = [ 4100 ];

        var st = gt();

        var postUrl = postTo[ Math.floor(Math.random()*postTo.length) ];

        console.log( postUrl );

        rest.post( postUrl,
            {
                  "data": data
                , "headers":
                    { "kloudid": kloudId, 'Connection':'close', 'Connection-Timeout': 10 }
            }
        ).on('complete',
            function( data, response )
                {
                    gt( "end: ",st );
                    if (response.statusCode == 202 ||response.statusCode == 201 || response.statusCode == 200)
                        {
                            try {
                                data =JSON.parse( data );
                            } catch(e) {}

                            if( data && data.error )
                                console.log( "1", data.message );
                            else
                                console.log( "2", data._id );
                            // you can get at the raw response like this...
                        }
                    else
                        {
                            console.log( "! Error ", response.statusCode, data );
                        }
                }
        );
    }

function gt( name, lastTime )
    {
        if( !name || name=="start" )
            {
                var d = new Date().getTime();
                var uu = uuid.new();
                return (d + "|" + uu);
            }
        else if( lastTime )
            {
                var props   = lastTime.split("|");
                var time    = parseInt(props[0]);
                var uu      = props[1];
                console.log( uu, name, ( new Date().getTime() - time ));
            }
        else
            {
                console.log( "logging: invalid start time  " + name);
            }
    }