2012-08-17 5 views
1

저는 웹 서버 (Cherokee)와 expressjs 웹 사이트 간의 성능 병목 현상을 식별하는 데 상당히 어려움을 겪고 있습니다.expressjs 스트레스 테스트

POST 트래픽이 증가함에 따라 성능 문제가 수시로 발생하기 시작했습니다. 그래서 웹 사이트의 1, 2, 3, 4 인스턴스의 파손 지점이 무엇인지보고 불량 성능 (초당 5 회, 초당 10 회)으로 인해 충격을 받았는지 확인하기위한 테스트를 설계했습니다.

내 성능 로깅 요청에 따라 전체 요청 시작이 1000-4000 ms 사이에서 시작되고 짧은 시간 후에 선형 추세가 증가하여 약 5 분 후에 요청이 40,000-60,0000 ms. 요청을 끝내기 시작하는 expressjs 웹 사이트 레코드의 성능 로깅은 100-400 밀리 초 (대부분이 시간의 90-390 밀리 초가 Java API가 응답하기를 기다리는 데 소요됩니다.)가 소요됩니다.

연결 풀링/최대 소켓을 조사했지만 express를 사용하여이를 구성하는 방법을 이해하지 못하고 트래픽이 증가하면서 wesite의 모든 성능 저하로 인한 열을 느끼기 시작했습니다.

지금 저는 두 가지 이론을 가지고 있습니다 : 1. 스트레스 테스트 코드에 뭔가 잘못되었습니다. 2. 스트레스 테스트 응용 프로그램 또는 익스프레스에서 요청을 보낼 때 작은 연결 풀이 있습니다.

위의 경우 중 하나라도 해당되는 경우 이러한 문제를 해결하는 방법에 대해서는 잘 모릅니다.

- 스트레스 테스트 응용 프로그램 -

/* 
* 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 같은 도구를 테스트 기존의 스트레스를 사용하여 봤어?

나만의 글을 쓰고 싶지만 기존 테스트는 견고하며로드 테스트 도구 대신 사이트 수정에 집중할 수 있습니다.

관련 문제