summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/deno_tcp_proxy.ts29
-rwxr-xr-xtools/http_benchmark.py26
-rw-r--r--tools/node_tcp_proxy.js68
3 files changed, 122 insertions, 1 deletions
diff --git a/tools/deno_tcp_proxy.ts b/tools/deno_tcp_proxy.ts
new file mode 100644
index 000000000..96877fa20
--- /dev/null
+++ b/tools/deno_tcp_proxy.ts
@@ -0,0 +1,29 @@
+// Used for benchmarking Deno's tcp proxy perfromance. See tools/http_benchmark.py
+const addr = Deno.args[1] || "127.0.0.1:4500";
+const originAddr = Deno.args[2] || "127.0.0.1:4501";
+
+const listener = Deno.listen("tcp", addr);
+
+async function handle(conn: Deno.Conn): Promise<void> {
+ const origin = await Deno.dial("tcp", originAddr);
+ try {
+ await Promise.all([Deno.copy(conn, origin), Deno.copy(origin, conn)]);
+ } catch (err) {
+ if (err.message !== "read error" && err.message !== "write error") {
+ throw err;
+ }
+ } finally {
+ conn.close();
+ origin.close();
+ }
+}
+
+async function main(): Promise<void> {
+ console.log("Listening on", addr);
+ while (true) {
+ const conn = await listener.accept();
+ handle(conn);
+ }
+}
+
+main();
diff --git a/tools/http_benchmark.py b/tools/http_benchmark.py
index 7348b6b5a..ca451a4e3 100755
--- a/tools/http_benchmark.py
+++ b/tools/http_benchmark.py
@@ -37,6 +37,18 @@ def deno_http(deno_exe):
})
+def deno_tcp_proxy(deno_exe, hyper_hello_exe):
+ deno_cmd = [
+ deno_exe, "run", "--allow-net", "tools/deno_tcp_proxy.ts", ADDR,
+ ORIGIN_ADDR
+ ]
+ print "http_proxy_benchmark testing DENO using net/tcp."
+ return run(
+ deno_cmd,
+ merge_env={"DENO_DIR": os.path.join(util.root_path, "js")},
+ origin_cmd=http_proxy_origin(hyper_hello_exe))
+
+
def deno_http_proxy(deno_exe, hyper_hello_exe):
deno_cmd = [
deno_exe, "run", "--allow-net", "tools/deno_http_proxy.ts", ADDR,
@@ -71,6 +83,16 @@ def node_http_proxy(hyper_hello_exe):
return run(node_cmd, None, http_proxy_origin(hyper_hello_exe))
+def node_tcp_proxy(hyper_hello_exe):
+ node_cmd = [
+ "node", "tools/node_tcp_proxy.js",
+ ADDR.split(":")[1],
+ ORIGIN_ADDR.split(":")[1]
+ ]
+ print "http_proxy_benchmark testing NODE tcp."
+ return run(node_cmd, None, http_proxy_origin(hyper_hello_exe))
+
+
def node_tcp():
node_cmd = ["node", "tools/node_tcp.js", ADDR.split(":")[1]]
print "http_benchmark testing node_tcp.js"
@@ -97,11 +119,13 @@ def http_benchmark(build_dir):
# "deno_http" was once called "deno_net_http"
"deno_http": deno_http(deno_exe),
"deno_proxy": deno_http_proxy(deno_exe, hyper_hello_exe),
+ "deno_proxy_tcp": deno_tcp_proxy(deno_exe, hyper_hello_exe),
"deno_core_single": deno_core_single(core_http_bench_exe),
"deno_core_multi": deno_core_multi(core_http_bench_exe),
# "node_http" was once called "node"
"node_http": node_http(),
"node_proxy": node_http_proxy(hyper_hello_exe),
+ "node_proxy_tcp": node_tcp_proxy(hyper_hello_exe),
"node_tcp": node_tcp(),
"hyper": hyper_http(hyper_hello_exe)
}
@@ -127,7 +151,7 @@ def run(server_cmd, merge_env=None, origin_cmd=None):
server = subprocess.Popen(server_cmd, env=env)
- time.sleep(5) # wait for server to wake up. TODO racy.
+ time.sleep(15) # wait for server to wake up. TODO racy.
try:
cmd = "third_party/wrk/%s/wrk -d %s http://%s/" % (util.platform(),
diff --git a/tools/node_tcp_proxy.js b/tools/node_tcp_proxy.js
new file mode 100644
index 000000000..7dc1b2612
--- /dev/null
+++ b/tools/node_tcp_proxy.js
@@ -0,0 +1,68 @@
+const net = require("net");
+
+process.on("uncaughtException", function(error) {
+ console.error(error);
+});
+
+if (process.argv.length != 4) {
+ console.log("usage: %s <localport> <remoteport>", process.argv[1]);
+ process.exit();
+}
+
+const localport = process.argv[2];
+const remoteport = process.argv[3];
+
+const remotehost = "127.0.0.1";
+
+const server = net.createServer(function(localsocket) {
+ const remotesocket = new net.Socket();
+
+ remotesocket.connect(remoteport, remotehost);
+
+ localsocket.on("data", function(data) {
+ const flushed = remotesocket.write(data);
+ if (!flushed) {
+ localsocket.pause();
+ }
+ });
+
+ remotesocket.on("data", function(data) {
+ const flushed = localsocket.write(data);
+ if (!flushed) {
+ remotesocket.pause();
+ }
+ });
+
+ localsocket.on("drain", function() {
+ remotesocket.resume();
+ });
+
+ remotesocket.on("drain", function() {
+ localsocket.resume();
+ });
+
+ localsocket.on("close", function() {
+ remotesocket.end();
+ });
+
+ remotesocket.on("close", function() {
+ localsocket.end();
+ });
+
+ localsocket.on("error", function() {
+ localsocket.end();
+ });
+
+ remotesocket.on("error", function() {
+ remotesocket.end();
+ });
+});
+
+server.listen(localport);
+
+console.log(
+ "redirecting connections from 127.0.0.1:%d to %s:%d",
+ localport,
+ remotehost,
+ remoteport
+);