/node-http-perf

Node HTTP Server Performance Tool

Primary LanguageJavaScript

Node HTTP Server Performance Tool

http-perf is a tool used to test HTTP/S server performance. It is basically an HTTP client that executes specified requests against a server and then measures and records response times and other metrics.

Its function is similar to the popular ab tool, and in fact the basic usage is identical. However, this tool goes above what ab provides for my needs. For example, it parses the server-side request time (if reported in headers) and displays it along with the client's view of request time for each request. It can also output its data in JSON.

Install

via npm, preferrably globally (-g)

$ npm install -g http-perf

This installs an executable called nperf.

You can run the tool directly

$ node node_modules/http-perf/bin/nperf

Or if installed globally

$ nperf

Quick Start

Send 10 requests to google.com with 5 concurrent requests:

$ nperf -c 5 -n 10 http://www.google.com/
[status] response# /request_id time: client time (ms) (server time (ms))
[200] 1 /1 time: 78 (-1)
[200] 2 /0 time: 89 (-1)
[200] 3 /3 time: 86 (-1)
[200] 4 /4 time: 88 (-1)
[200] 5 /2 time: 91 (-1)
[200] 6 /6 time: 76 (-1)
[200] 7 /5 time: 82 (-1)
[200] 8 /7 time: 82 (-1)
[200] 9 /9 time: 82 (-1)
[200] 10 /8 time: 100 (-1)
stats:
{ min: 76,
  max: 100,
  avg: 85.4,
  count: 10,
  rate: 50.76142131979695,
  start: 1337831509423,
  total_time: 197 }

We see that 10 requests were sent to the server with the average response time being 85.4 ms. The server processed requests at a rate of about 50 requests per second.

Server processing time is not available (-1) because Google does not return it in a header. Supported headers are: X-Response-Time and X-Runtime.

Usage

Display usage:

$ nperf -h
Stress test an HTTP server.
Usage: node ./bin/nperf [options] [target server]

Options:
  --conf, --config  Configuration file with targets                 
  --target, -t      Target server name in config file               
  -c                Number of concurrent requests                   
  -n                Max number of total requests                    
  -o                Output format: [text|json]. Default: text       
  -v, --verbose     Verbose output                                  
  --dry-run         Read config, but don't run (can be used with -v)
  --help, -h        Print this usage and exit 

One useful feature of the tool is that you can save all parameters and server targets in a config file and refer to it instead of specifying them on the commandline. All parameters specified on the commandline override their counterparts in the config file.

Sample config file config.js:

module.exports = {
    settings: {
        concurrency: 10,  // -c
        max_requests: 200,  // -n
        output_format: 'text' // -o 'text' or 'json'
    },
    targets: {
        // can have multiple targets here
        // pick one using the --target commandline argument
        local: {
            host: 'localhost',
            port: 8080,
            path: '/path/to/http/resource',
            headers: {  
                'X-Optional-Header': "header value"
            }
        },
        google: {
            host: 'www.google.com',
            port: 80,
            path: '/'
        }
    }
};

Set the port to 443 for HTTPS.

To use the config file and specify the google target, run:

$ nperf --conf config.js -t google
[status] response# /request_id time: client time (ms) (server time (ms))
[200] 1 /1 time: 161 (-1)
[200] 2 /3 time: 164 (-1)
[200] 3 /6 time: 165 (-1)
 ... output truncated ...
[200] 198 /198 time: 67 (-1)
[200] 199 /197 time: 81 (-1)
[200] 200 /199 time: 71 (-1)
stats:
{ min: 43,
  max: 722,
  avg: 110.34500000000004,
  count: 200,
  rate: 88.65248226950355,
  start: 1337832532680,
  total_time: 2256 }

The number of requests and concurrency values are taken from the config file, as well as the details for the google target. Output above is truncated for brevity.

More examples

Override config with commandline parameters:

$ nperf --config config.js --target google -c 1 -n 20

JSON output:

$ nperf -o json http://www.google.com -n 5
{"status":"status","response_count":"response#","request_id":"request_id","client_time":"client time (ms)","server_time":"server time (ms)"}
{"status":200,"request_id":2,"response_count":1,"client_time":467,"server_time":-1}
{"status":200,"request_id":0,"response_count":2,"client_time":475,"server_time":-1}
{"status":200,"request_id":4,"response_count":3,"client_time":475,"server_time":-1}
{"status":200,"request_id":1,"response_count":4,"client_time":477,"server_time":-1}
{"status":200,"request_id":3,"response_count":5,"client_time":486,"server_time":-1}
stats:
{ min: 467,
  max: 486,
  avg: 476,
  count: 5,
  rate: 10.101010101010102,
  start: 1337833296687,
  total_time: 495 }

Contributing

I welcome pull requests!

License

This software is distributed under the MIT License.