2012-08-17 157 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

我知道這是很有誘惑力的寫自己的,但是現有的固體,你可以專注於修復您的網站,而不是你的負載測試工具。