summaryrefslogtreecommitdiff
path: root/benchmark
diff options
context:
space:
mode:
authorJames M Snell <jasnell@gmail.com>2017-07-17 10:29:42 -0700
committerJames M Snell <jasnell@gmail.com>2017-08-04 12:55:58 -0700
commitb1e055696fbcd4b8829630d0be787cfc74fe913b (patch)
treed0d5be3a2e46ff5a38e139eb519e3aa5322a2d71 /benchmark
parente71e71b5138c3dfee080f4215dd957dc7a6cbdaf (diff)
downloadandroid-node-v8-b1e055696fbcd4b8829630d0be787cfc74fe913b.tar.gz
android-node-v8-b1e055696fbcd4b8829630d0be787cfc74fe913b.tar.bz2
android-node-v8-b1e055696fbcd4b8829630d0be787cfc74fe913b.zip
http2: add tests and benchmarks
PR-URL: https://github.com/nodejs/node/pull/14239 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/README.md6
-rw-r--r--benchmark/_http-benchmarkers.js55
-rw-r--r--benchmark/http2/respond-with-fd.js43
-rw-r--r--benchmark/http2/simple.js38
4 files changed, 141 insertions, 1 deletions
diff --git a/benchmark/README.md b/benchmark/README.md
index 17c733e6eb..dfdf319b9c 100644
--- a/benchmark/README.md
+++ b/benchmark/README.md
@@ -98,6 +98,12 @@ directory, see [the guide on benchmarks](../doc/guides/writing-and-running-bench
</td>
</tr>
<tr>
+ <td>http2</td>
+ <td>
+ Benchmarks for the <code>http2</code> subsystem.
+ </td>
+ </tr>
+ <tr>
<td>misc</td>
<td>
Miscellaneous benchmarks and benchmarks for shared
diff --git a/benchmark/_http-benchmarkers.js b/benchmark/_http-benchmarkers.js
index 3f17f05f83..f9359b13d5 100644
--- a/benchmark/_http-benchmarkers.js
+++ b/benchmark/_http-benchmarkers.js
@@ -111,10 +111,63 @@ class TestDoubleBenchmarker {
}
}
+/**
+ * HTTP/2 Benchmarker
+ */
+class H2LoadBenchmarker {
+ constructor() {
+ this.name = 'h2load';
+ this.executable = 'h2load';
+ const result = child_process.spawnSync(this.executable, ['-h']);
+ this.present = !(result.error && result.error.code === 'ENOENT');
+ }
+
+ create(options) {
+ const args = [];
+ if (typeof options.requests === 'number')
+ args.push('-n', options.requests);
+ if (typeof options.clients === 'number')
+ args.push('-c', options.clients);
+ if (typeof options.threads === 'number')
+ args.push('-t', options.threads);
+ if (typeof options.maxConcurrentStreams === 'number')
+ args.push('-m', options.maxConcurrentStreams);
+ if (typeof options.initialWindowSize === 'number')
+ args.push('-w', options.initialWindowSize);
+ if (typeof options.sessionInitialWindowSize === 'number')
+ args.push('-W', options.sessionInitialWindowSize);
+ if (typeof options.rate === 'number')
+ args.push('-r', options.rate);
+ if (typeof options.ratePeriod === 'number')
+ args.push(`--rate-period=${options.ratePeriod}`);
+ if (typeof options.duration === 'number')
+ args.push('-T', options.duration);
+ if (typeof options.timeout === 'number')
+ args.push('-N', options.timeout);
+ if (typeof options.headerTableSize === 'number')
+ args.push(`--header-table-size=${options.headerTableSize}`);
+ if (typeof options.encoderHeaderTableSize === 'number') {
+ args.push(
+ `--encoder-header-table-size=${options.encoderHeaderTableSize}`);
+ }
+ const scheme = options.scheme || 'http';
+ const host = options.host || '127.0.0.1';
+ args.push(`${scheme}://${host}:${options.port}${options.path}`);
+ const child = child_process.spawn(this.executable, args);
+ return child;
+ }
+
+ processResults(output) {
+ const rex = /(\d+(?:\.\d+)) req\/s/;
+ return rex.exec(output)[1];
+ }
+}
+
const http_benchmarkers = [
new WrkBenchmarker(),
new AutocannonBenchmarker(),
- new TestDoubleBenchmarker()
+ new TestDoubleBenchmarker(),
+ new H2LoadBenchmarker()
];
const benchmarkers = {};
diff --git a/benchmark/http2/respond-with-fd.js b/benchmark/http2/respond-with-fd.js
new file mode 100644
index 0000000000..d7a312c78b
--- /dev/null
+++ b/benchmark/http2/respond-with-fd.js
@@ -0,0 +1,43 @@
+'use strict';
+
+const common = require('../common.js');
+const PORT = common.PORT;
+const path = require('path');
+const fs = require('fs');
+
+const file = path.join(path.resolve(__dirname, '../fixtures'), 'alice.html');
+
+var bench = common.createBenchmark(main, {
+ requests: [100, 1000, 10000, 100000, 1000000],
+ streams: [100, 200, 1000],
+ clients: [1, 2]
+}, { flags: ['--expose-http2', '--no-warnings'] });
+
+function main(conf) {
+
+ fs.open(file, 'r', (err, fd) => {
+ if (err)
+ throw err;
+
+ const n = +conf.requests;
+ const m = +conf.streams;
+ const c = +conf.clients;
+ const http2 = require('http2');
+ const server = http2.createServer();
+ server.on('stream', (stream) => {
+ stream.respondWithFD(fd);
+ stream.on('error', (err) => {});
+ });
+ server.listen(PORT, () => {
+ bench.http({
+ path: '/',
+ requests: n,
+ maxConcurrentStreams: m,
+ clients: c,
+ threads: c
+ }, () => server.close());
+ });
+
+ });
+
+}
diff --git a/benchmark/http2/simple.js b/benchmark/http2/simple.js
new file mode 100644
index 0000000000..d12b20fc5a
--- /dev/null
+++ b/benchmark/http2/simple.js
@@ -0,0 +1,38 @@
+'use strict';
+
+const common = require('../common.js');
+const PORT = common.PORT;
+
+const path = require('path');
+const fs = require('fs');
+
+const file = path.join(path.resolve(__dirname, '../fixtures'), 'alice.html');
+
+var bench = common.createBenchmark(main, {
+ requests: [100, 1000, 10000, 100000],
+ streams: [100, 200, 1000],
+ clients: [1, 2]
+}, { flags: ['--expose-http2', '--no-warnings'] });
+
+function main(conf) {
+ const n = +conf.requests;
+ const m = +conf.streams;
+ const c = +conf.clients;
+ const http2 = require('http2');
+ const server = http2.createServer();
+ server.on('stream', (stream) => {
+ const out = fs.createReadStream(file);
+ stream.respond();
+ out.pipe(stream);
+ stream.on('error', (err) => {});
+ });
+ server.listen(PORT, () => {
+ bench.http({
+ path: '/',
+ requests: n,
+ maxConcurrentStreams: m,
+ clients: c,
+ threads: c
+ }, () => { server.close(); });
+ });
+}