我在嘗試確定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);
}
}