2012-08-17 139 views
1

我在尝试确定Web服务器(Cherokee)和expressjs网站之间的性能瓶颈方面遇到了相当困难的时间。expressjs压力测试

由于POST流量不断增加,我们开始不时发现性能问题。因此,我设计了一个测试,以查看网站1,2,3和4个实例的突破点是什么,并且由于糟糕的性能(每秒5个很好,每秒10个很差)而感到震惊。

根据我的性能记录,一个完整的请求开始到结束需要在1000-4000毫秒之间开始,并且在短时间开始后以线性趋势增加,以便约5分钟后请求需要40,000-60,0000女士。在开始到结束的请求expressjs网站记录性能记录需要100-400毫秒之间(大部分时间的这段时间90-390毫秒花费在等待的Java API响应)。

我已经调查了连接池/ MAX插槽,但是不知道如何使用这个表达,并与不断增长的交通我开始从wesite每降低性能感受湿热配置。

现在我有两个理论: 1.压力测试代码有一些真正的错误; 2.从压力测试应用程序或expressjs发送请求时,有一个小连接池。

如果上述任一情况属实,我不知道如何解决这些问题。

- 压力测试的应用程序 -

/* 
* 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); 
      } 
    } 

回答

1

你有没有看使用现有的压力测试工具,如ab (apache bench)siege

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