Simple Node.js interface for httperf. This is a node port of HTTPerf.rb and works pretty much the same way.
What hasn't been ported or is different from the ruby version:
parse
is true by default.tee
isn't currently supported.httperf
must be in yourPATH
Tested on the following node versions (via Travis-ci.org:
$ npm install httperfjs
var HTTPerf = require('httperfjs'); var httperf = new HTTPerf({ "server": "mervine.net", "verbose": true, "hog": true, "uri": "/about", "num-conns": 100} ); httperf.run(function (result) { console.log(result); console.log(result.connection_time_avg); }); // => { object with httperf values } // => '123.4' httperf.parse = false; var child = httperf.run(function (result) { console.log(result); }); // => "string with httperf stdout" // httperf dumps data on SIGINT (crtl-c), HTTPerf's run // supports this as well, with the following addition // to your scripts process.on('SIGINT', function() { child.send('SIGINT'); });
// file: ./test/benchmark.js var HTTPerf = require('httperfjs'); var httperf = new HTTPerf({ server: "mervine.net", uri: "/", "num-conns": 9 }); var run; module.exports = { tearDown: function (callback) { run = undefined; callback(); }, 'homepage should be quick': function (test) { test.expect(1); httperf.run( function (run) { test.ok(run.connection_time_median < 200, "homepage was too slow: got " + run.connection_time_median + " but expected: < 200"); test.done(); }); }, 'archive should be quick': function (test) { test.expect(1); httperf.run( function (run) { test.ok(run.connection_time_median < 200, "archive was too slow: got " + run.connection_time_avg + " but expected: < 200"); test.done(); }); } }; // $ ./node_modules/.bin/nodeunit ./test/benchmark.js
command max_connect_burst_length total_connections total_requests total_replies total_test_duration connection_rate_per_sec connection_rate_ms_conn connection_time_min connection_time_avg connection_time_max connection_time_median connection_time_stddev connection_time_connect connection_length request_rate_per_sec request_rate_ms_request request_size reply_rate_min reply_rate_avg reply_rate_max reply_rate_stddev reply_rate_samples reply_time_response reply_time_transfer reply_size_header reply_size_content reply_size_footer reply_size_total reply_status_1xx reply_status_2xx reply_status_3xx reply_status_4xx reply_status_5xx cpu_time_user_sec cpu_time_system_sec cpu_time_user_pct cpu_time_system_pct cpu_time_total_pct net_io_kb_sec net_io_bps errors_total errors_client_timeout errors_socket_timeout errors_conn_refused errors_conn_reset errors_fd_unavail errors_addr_unavail errors_ftab_full errors_other
These require a non-standard version of httperf
. See: httperf-0.9.1 with individual connection times.
connection_time_75_pct connection_time_80_pct connection_time_85_pct connection_time_90_pct connection_time_95_pct connection_time_99_pct
"add-header" "burst-length" "client" "close-with-reset" "debug" "failure-status" "hog" "http-version" "max-connections" "max-piped-calls" "method" "no-host-hdr" "num-calls" "num-conns" "period" "port" "print-reply" "print-request" "rate" "recv-buffer" "retry-on-failure" "send-buffer" "server" "server-name" "session-cookies" "ssl" "ssl-ciphers" "ssl-no-reuse" "think-timeout" "timeout" "uri" "verbose" "version" "wlog" "wsess" "wsesslog" "wset"
Removing runSync
. Refactoring run
to support sending spawned process SIGINT
to capture current report from httperf and exit.
In my last post on this topic (Benchmarking with HTTPerf.js and NodeUnit) I covered benchmarking application render times from the server to first byte. In this post, I'm going cover basic client benchmarking using YSlow and PhantomJS via YSlow.js on Node.js.
I covered this in the HTTPerf.js README a bit, but wanted to take a deer look at how I'm using HTTPerf.js to benchmark web applications.