저는 웹 서버 (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);
}
}