2012-08-17 5 views
1

J'ai du mal à identifier un goulot d'étranglement au niveau des performances entre mon site Web (Cherokee) et les sites Web d'expressjs. En raison d'une augmentation du trafic POST, nous commençons à voir des problèmes de performance de temps à autre. J'ai donc conçu un test pour voir quel serait le point de rupture de 1, 2, 3 et 4 instances du site et a été choqué par une mauvaise performance (fonctionnant bien à 5 par seconde et très médiocrement à 10 par seconde). Selon mes performances de journalisation, une requête complète de début à la fin prend entre 1000 et 4000 ms, et après une courte période commence à augmenter avec une tendance linéaire, de sorte qu'après environ 5 minutes, les demandes prennent 40 000-60 0000 Mme. La journalisation des performances dans les enregistrements de site Web expressjs qui commencent à terminer une requête prend entre 100 et 400 ms (la plupart du temps, 90-390 ms de ce temps sont dépensés en attente d'une API Java pour répondre).test de stress expressjs

J'ai étudié les connexions de connexion/max, mais je ne comprends pas comment le configurer en utilisant express, et avec un trafic toujours croissant je commence à ressentir la chaleur de chaque performance réductrice du site.

En ce moment j'ai deux théories: 1. Il y a quelque chose de vraiment faux avec le code de test de stress; 2. Il existe un petit pool de connexion lors de l'envoi de requêtes depuis l'application de test de stress ou dans expressjs.

Si l'une de ces réponses est vraie, je n'ai aucune idée sur la façon de résoudre ces problèmes.

- application de test de stress -

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

Répondre

1

Avez-vous envisagé d'utiliser des outils existants comme stress tests ab (apache bench) ou siege?

Je sais qu'il est tentant d'écrire les vôtres, mais ceux qui existent déjà sont solides et vous pouvez vous concentrer sur la réparation de votre site au lieu de votre outil de test de charge.

Questions connexes