expression压力testing

我有一个相当困难的时间来确定我的networking服务器(切诺基)和expressjs网站之间的性能瓶颈。

由于POSTstream量的增长,我们开始不时地看到性能问题。 所以我devise了一个testing,看网站1,2,3和4个实例的突破点是什么,并且由于糟糕的性能(以每秒5个很好,每秒10个很差)而震惊。

根据我的性能logging,一个完整的请求开始到结束在1000-4000毫秒之间开始,在短时间开始之后以线性趋势增加,因此在大约5分钟之后请求需要40,000-60,000毫秒。 在expressjs网站logging中,开始结束请求的性能logging需要100-400毫秒(大部分时间是90-390毫秒,这个时间是等待Java API响应的)。

我已经调查了连接池/最大套接字,但不知道如何使用快速configuration,并且随着不断增长的stream量,我们开始感受到来自每一个减弱性能的热量。

现在我有两个理论:1.压力testing代码有些问题, 2.从压力testing应用程序或expressjs发送请求时,有一个小的连接池。

如果上述任何一个是真的,我不知道如何解决这些问题。

– 压力testing应用程序 –

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

你看过使用现有的压力testing工具,如AB(阿帕奇板凳)或围攻 ?

我知道你自己写的很有吸引力,但是现有的方法是可靠的,你可以专注于修复你的网站而不是你的负载testing工具。