This repository has been archived by the owner on Apr 22, 2023. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
A benchmark script for measuring client latency
- Loading branch information
Showing
1 changed file
with
81 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
// first start node http_simple.js | ||
var http = require('http'); | ||
|
||
var latency = []; | ||
|
||
var numRequests = parseInt(process.argv[2], 10) || 100; | ||
var maxSockets = parseInt(process.argv[3], 10) || 100; | ||
var runs = parseInt(process.argv[4], 10) || 100; | ||
var prefix = process.argv[5] || ''; | ||
if (prefix) prefix += '_'; | ||
var request = require('request'); | ||
var r = 0; | ||
|
||
var port = parseInt(process.env.PORT, 10) || 8000; | ||
var host = process.env.HOST || '127.0.0.1'; | ||
|
||
http.globalAgent.maxSockets = maxSockets; | ||
|
||
run(); | ||
|
||
function run() { | ||
if (r++ === runs) { | ||
return finish(); | ||
} | ||
|
||
// make numRequests in parallel | ||
// retain the order in which they are *made*. This requires trapping | ||
// each one in a closure, since otherwise, we'll of course end | ||
// up mostly sorting them in ascending order, since the cb from a | ||
// fast request will almost always be called before the cb from a | ||
// slow one. | ||
var c = numRequests; | ||
var lat = []; | ||
latency.push(lat); | ||
for (var i = 0; i < numRequests; i++) (function (i) { | ||
makeRequest(function(l) { | ||
lat[i] = l; | ||
c--; | ||
if (c === 0) run(); | ||
}); | ||
})(i); | ||
} | ||
|
||
function makeRequest(cb) { | ||
var opts = { host: host, | ||
port: port, | ||
uri: 'http://'+host+':'+port+'/bytes/12', | ||
forever: true, | ||
path: '/bytes/12' }; | ||
var pre = Date.now(); | ||
var req = http.get(opts, function(res) { | ||
return cb(Date.now() - pre); | ||
}); | ||
} | ||
|
||
function finish() { | ||
var data = []; | ||
latency.forEach(function(run, i) { | ||
run.forEach(function(l, j) { | ||
data[j] = data[j] || []; | ||
data[j][i] = l; | ||
}); | ||
}); | ||
|
||
data = data.map(function (l, i) { | ||
return l.join('\t') | ||
}).join('\n') + '\n'; | ||
|
||
var fname = prefix + | ||
'client_latency_' + | ||
numRequests + '_' + | ||
maxSockets + '_' + | ||
runs + '.tab'; | ||
var path = require('path'); | ||
fname = path.resolve(__dirname, '..', 'out', fname); | ||
fname = path.relative(process.cwd(), fname); | ||
require('fs').writeFile(fname, data, function(er) { | ||
if (er) throw er; | ||
console.log('written: %s', fname); | ||
}); | ||
} |