Page MenuHomePhorge

No OneTemporary

Size
23 KB
Referenced Files
None
Subscribers
None
diff --git a/benchmarks/main.exs b/benchmarks/main.exs
index 813df84..75bb08a 100644
--- a/benchmarks/main.exs
+++ b/benchmarks/main.exs
@@ -1,153 +1,122 @@
-defmodule AnoPool.Benchmark.CowboyHandler do
- def init(req, state) do
- bytes = :cowboy_req.binding(:bytes, req)
- bits = bytes * 8
- chunk_size = :cowboy_req.binding(:chunk_size, req, nil)
-
- unless chunk_size do
- req =
- :cowboy_req.reply(
- 200,
- %{"content-type" => "application/octet-stream"},
- <<0::size(bits)>>,
- req
- )
-
- {:ok, req, state}
- else
- req = :cowboy_req.stream_reply(200, %{"content-type" => "application/octet-stream"}, req)
- req = stream_body(req, bytes, chunk_size)
- {:ok, req, state}
- end
- end
-
- defp stream_body(req, bytes, chunk_size) do
- if bytes - chunk_size < 0 do
- bits = bytes * 8
- :cowboy_req.stream_body(<<0::size(bits)>>, :fin, req)
- else
- bits = chunk_size * 8
- :cowboy_req.stream_body(<<0::size(bits)>>, :nofin, req)
- stream_body(req, bytes - chunk_size, chunk_size)
- end
- end
-end
-
-dispatch =
- :cowboy_router.compile([
- {:_,
- [
- {"/:bytes/[:chunk_size]", [{:bytes, :int}, {:chunk_size, :int}],
- AnoPool.Benchmark.CowboyHandler, %{}}
- ]}
- ])
-
-{:ok, _} =
- :cowboy.start_clear(:benchmark_http_clear_listener, [], %{
- env: %{dispatch: dispatch}
- })
-
-http_clear_port = :ranch.get_port(:benchmark_http_clear_listener)
-
-{:ok, _} =
- :cowboy.start_clear(:benchmark_http2_clear_listener, [], %{
- env: %{dispatch: dispatch},
- protocols: [:http2]
- })
-
-http2_clear_port = :ranch.get_port(:benchmark_http2_clear_listener)
-
defmodule AnoPool.Benchmark.Helpers do
def handle_mint_response(conn, ref, state \\ %{}) do
receive do
message ->
case Mint.HTTP.stream(conn, message) do
:unknown ->
handle_mint_response(conn, state)
{:ok, conn, responses} ->
state =
Enum.reduce(responses, state, fn
{:status, ^ref, status_code}, state ->
Map.put(state, :status_code, status_code)
{:headers, ^ref, headers}, state ->
Map.put(state, :headers, headers)
{:data, ^ref, chunk}, state ->
if data = state[:data] do
data = data <> chunk
%{state | data: data}
else
Map.put(state, :data, chunk)
end
{:done, ^ref}, state ->
Map.put(state, :fin, true)
end)
unless state[:fin] do
handle_mint_response(conn, ref, state)
else
{state.status_code, state.headers, state.data, fn -> Mint.HTTP.close(conn) end}
end
end
end
end
end
+host = List.first(System.argv()) || "127.0.0.1"
+
inputs =
Enum.flat_map(
%{
- "1MB transfer without chunks" => "/1048576",
- "8MB transfer, chunked by 1MB" => "/8388608/1048576",
- "20MB transfer, chunked by 1MB" => "/20971520/1048576"
+ "10kb get without chunks" => "/10240",
+ "1MB get without chunks" => "/1048576",
+ "20MB get, chunked by 1MB" => "/20971520/1048576",
+ "20MB get without chunks" => "/20971520"
},
fn {key, path} ->
[
- {"HTTP1 over TCP: " <> key, {path, :http, http_clear_port}},
- {"HTTP2 over TCP: " <> key, {path, :http2, http2_clear_port}}
+ {"HTTP1 over TCP: " <> key, {path, :tcp, :http, "127.0.0.1", 4545}},
+ {"HTTP2 over TCP: " <> key, {path, :tcp, :http2, "127.0.0.1", 4546}},
+ {"HTTP1 over TLS: " <> key, {path, :tls, :http, "127.0.0.1", 4547}},
+ {"HTTP2 over TLS: " <> key, {path, :tls, :http2, "127.0.0.1", 4548}}
]
end
)
|> Enum.into(%{})
+# inputs = Map.put(inputs, "httpbin", {"/bytes/1048576", :tls, :http2, "httpbin.org", 443})
+# inputs = Map.put(inputs, "httpbin HTTP1", {"/bytes/1048576", :tls, :http, "httpbin.org", 443})
+
Benchee.run(
%{
- "raw gun stream 1mb" => fn {path, proto, port} ->
- {:ok, conn} = :gun.open('127.0.0.1', port, %{protocols: [proto]})
- :gun.await_up(conn)
- stream = :gun.get(conn, path)
- {:response, :nofin, status, headers} = :gun.await(conn, stream)
- {:ok, body} = :gun.await_body(conn, stream)
- teardown = fn -> :gun.shutdown(conn) end
- {status, headers, body, teardown}
- end,
- "raw mint stream 1mb" => fn {path, proto, port} ->
- proto =
- case proto do
- :http -> :http1
- proto -> proto
- end
-
- {:ok, conn} = Mint.HTTP.connect(:http, "127.0.0.1", port, protocols: [proto])
- {:ok, conn, request_ref} = Mint.HTTP.request(conn, "GET", path, [], nil)
- AnoPool.Benchmark.Helpers.handle_mint_response(conn, request_ref)
- end
+ "Gun" =>
+ {fn {path, transport, proto, host, port} ->
+ {:ok, conn} = :gun.open(host, port, %{protocols: [proto], transport: transport})
+
+ {:ok, ^proto} = :gun.await_up(conn)
+ stream = :gun.get(conn, path)
+ {:response, :nofin, status, headers} = :gun.await(conn, stream)
+ {:ok, body} = :gun.await_body(conn, stream)
+ teardown = fn -> :gun.shutdown(conn) end
+ {status, headers, body, teardown}
+ end,
+ before_scenario: fn {path, transport, proto, host, port} ->
+ {path, transport, proto, to_charlist(host), port}
+ end},
+ "Mint" =>
+ {fn {path, scheme, proto, host, port, transport_opts} ->
+ {:ok, conn} =
+ Mint.HTTP.connect(scheme, host, port,
+ protocols: [proto],
+ transport_opts: transport_opts
+ )
+
+ {:ok, conn, request_ref} = Mint.HTTP.request(conn, "GET", path, [], nil)
+ AnoPool.Benchmark.Helpers.handle_mint_response(conn, request_ref)
+ end,
+ before_scenario: fn {path, transport, proto, host, port} ->
+ {scheme, transport_opts} =
+ case transport do
+ :tcp -> {:http, []}
+ :tls -> {:https, [verify: :verify_none]}
+ end
+
+ proto =
+ case proto do
+ :http -> :http1
+ proto -> proto
+ end
+
+ {path, scheme, proto, host, port, transport_opts}
+ end}
},
inputs: inputs,
after_each: fn {status, headers, body, teardown} ->
teardown.()
200 = status
{"content-type", "application/octet-stream"} =
Enum.find(headers, fn
{"content-type", _} -> true
_ -> false
end)
size = bit_size(body)
<<0::size(size)>> = body
:timer.sleep(10)
end
)
diff --git a/benchmarks/server.exs b/benchmarks/server.exs
new file mode 100644
index 0000000..513820b
--- /dev/null
+++ b/benchmarks/server.exs
@@ -0,0 +1,88 @@
+defmodule AnoPool.Benchmark.CowboyHandler do
+ def init(%{method: "GET"} = req, state) do
+ bytes = :cowboy_req.binding(:bytes, req)
+ bits = bytes * 8
+ chunk_size = :cowboy_req.binding(:chunk_size, req, nil)
+
+ unless chunk_size do
+ req =
+ :cowboy_req.reply(
+ 200,
+ %{"content-type" => "application/octet-stream"},
+ <<0::size(bits)>>,
+ req
+ )
+
+ {:ok, req, state}
+ else
+ req = :cowboy_req.stream_reply(200, %{"content-type" => "application/octet-stream"}, req)
+ req = stream_body(req, bytes, chunk_size)
+ {:ok, req, state}
+ end
+ end
+
+ defp stream_body(req, bytes, chunk_size) do
+ if bytes - chunk_size < 0 do
+ bits = bytes * 8
+ :cowboy_req.stream_body(<<0::size(bits)>>, :fin, req)
+ else
+ bits = chunk_size * 8
+ :cowboy_req.stream_body(<<0::size(bits)>>, :nofin, req)
+ stream_body(req, bytes - chunk_size, chunk_size)
+ end
+ end
+end
+
+dispatch =
+ :cowboy_router.compile([
+ {:_,
+ [
+ {"/:bytes/[:chunk_size]", [{:bytes, :int}, {:chunk_size, :int}],
+ AnoPool.Benchmark.CowboyHandler, %{}}
+ ]}
+ ])
+
+{:ok, _} =
+ :cowboy.start_clear(:benchmark_http_clear_listener, [port: 4545], %{
+ env: %{dispatch: dispatch},
+ protocols: [:http]
+ })
+
+{:ok, _} =
+ :cowboy.start_clear(:benchmark_http2_clear_listener, [port: 4546], %{
+ env: %{dispatch: dispatch},
+ protocols: [:http2]
+ })
+
+ssl_dir = Path.join([File.cwd!(), "benchmarks", "ssl"])
+
+ssl_opts = [
+ certfile: Path.join([ssl_dir, "server.pem"])
+]
+
+{:ok, _} =
+ :cowboy.start_tls(
+ :benchmark_http_tls_listener,
+ ssl_opts ++ [port: 4547],
+ %{
+ env: %{dispatch: dispatch},
+ protocols: [:http]
+ }
+ )
+
+{:ok, _} =
+ :cowboy.start_tls(
+ :benchmark_http2_tls_listener,
+ ssl_opts ++ [port: 4548],
+ %{
+ env: %{dispatch: dispatch},
+ protocols: [:http2]
+ }
+ )
+
+# Assume all servers got started on the same interface
+{addr, _} = :ranch.get_addr(:benchmark_http2_tls_listener)
+
+IO.puts("Benchmark server started at #{inspect(addr)}")
+
+Supervisor.start_link([], strategy: :one_for_one)
diff --git a/benchmarks/ssl/key.pem b/benchmarks/ssl/key.pem
new file mode 100644
index 0000000..835b23e
--- /dev/null
+++ b/benchmarks/ssl/key.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+Ityyze4tHGkVNoAvJ6mdtfZG/0ZeQHE=
+-----END PRIVATE KEY-----
diff --git a/benchmarks/ssl/server.pem b/benchmarks/ssl/server.pem
new file mode 100644
index 0000000..a1d9210
--- /dev/null
+++ b/benchmarks/ssl/server.pem
@@ -0,0 +1,79 @@
+-----BEGIN CERTIFICATE-----
+MIIEljCCAn4CCQDKyjsgZHEaQDANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV
+UzAeFw0yMDA5MTIxODE1MjdaFw0yMTA5MTIxODE1MjdaMA0xCzAJBgNVBAYTAlVT
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAw1zu+gyslb/YBVqbsRBl
+oBYloxynlqBbuVXqJOTI47A0EJlqNIq5XfzRhSWlJiu0ffQnNI9RmATe8xZ35WLT
+Sjo4GVCUiQI0ojr8op0Z28LtRLyN2xhDewtco3X/EMM/AUeiNy2dW1w3OocqRb4S
+s6TPPHqL5qjMl/yE3Tt3pALoFS7WDm9kaBz8DYRjba52dnjQ08y3+u+AL4LchAbK
+VGKXEbEpdKBwGfXDvYX0ei+N/sLFLFOH3a+4ZxUVCPQWKLRTh4xprPvAg+iKEI5k
+tIRCt8Y8AbmNejpWpvFkwOUWfMzSRsyTod9hGp23PFmhj5YBz901yKvNjycmCUy8
+z4O5G19XMzn3uzaj/rsB4R9/z5rBn512ydwESz5V3iI7RzNy6fa8IIsOWYoyChbY
+OOBzuSu5MXnPKrUjEeBHZxqlEDdrnfbu3ENc9Q7W5+Bge5sC14v+fbyx2tIuvSUw
+01lFBT6x6XWjxcakbR6arO0y5dGX1i7lU/wGHqNLdHc/hJZBWo2F+xGWXu76PFB7
+nBa7U5nWMTIkf86E0y6/LxFaBIK7aPu7eIC0gmhp+DdvUZ4Zr0HhfLTen/cF0VTv
+CGpqQvjG0kFdtBKq6xaFb4HIR+RRGqCF3U/9S1qwSlUagnB4H0cn5Yzy1/bZ/lkX
+Sdxb3lgVIBdNjtMiJXumqZMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAun4sSPig
+LK/hZSISP/QXIsU0sEAkg4ySi3UcSSO4DiCxiX4HguxGwq0FSPY0gU4z/2Vh4tZ2
+ovzF6VusQr8yXpRBysDQC7I6BEJCGPBl8ArHDBhUbXrr98k6XcDn6HkP6Znukvd2
+N7UayZvRvcI5RP6yeZeyjlaZ78yZxzkOjulHCXBWJadH4u4BnYI4frM6euVdYG+t
+AhNVKdvn/GXccOskCERwnQm3T/DAk/vcZ5aXhoXNNWQKELoknzlpYh/cwEc9/YPY
+EsUpUA7YMpB/rfwIEeEaQm+QbupEPEOui5iJ8TjvKMwtnqw3De8RX9sjjMkh2F7N
+WBtVlU9GpB+AKFLfY9PanngEEqEgw3S5HG1y3k7/Lrghyeam8Il5OUYdr6ADUUDO
+bFyjpVdtoKg728SnCBvOkoRkhjglzYwJMZ7f7qxwnTXH9TFT50bp6psY+OKo7aXQ
+aEG2LRmyyAvZm61GCNg3T+3QOfq20AUpnZTkOBTR96C9QoFf8a2wT9IP5W1mu9BP
+7vM/B/qXDgoU5zxReuGgvF/eqkDP6vb/KfYv1E4FiOPPHi10MkjyMaiZuVPQb5gP
+fqjTLXKZo2zDF2O6wUs8dAYqLkzKrH1ST2M9I4j1lYsh5tc9AO+QtvsjU30pnzYF
+b92zR22xk71xyXUwBBwQD31rXA399za/+Jw=
+-----END CERTIFICATE-----
+-----BEGIN PRIVATE KEY-----
+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
+Ityyze4tHGkVNoAvJ6mdtfZG/0ZeQHE=
+-----END PRIVATE KEY-----
diff --git a/mix.exs b/mix.exs
index 2f06f92..cae6cde 100644
--- a/mix.exs
+++ b/mix.exs
@@ -1,36 +1,37 @@
defmodule AnoPool.MixProject do
use Mix.Project
def project do
[
app: :ano_pool,
version: "0.1.0",
elixir: "~> 1.10",
start_permanent: Mix.env() == :prod,
deps: deps(),
preferred_cli_env: [bench: :bench],
aliases: [bench: "run benchmarks/main.exs"]
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
{:cowboy, "~> 2.8", only: [:bench]},
{:benchee, "~> 1.0", only: [:bench]},
{:finch, "~> 0.3", only: [:bench]},
+ {:hackney, "~> 1.16", only: [:bench]},
{:gun,
git: "https://github.com/ninenines/gun", ref: "921c47146b2d9567eac7e9a4d2ccc60fffd4f327"},
{:cowlib, "~> 2.9.1", override: true}
]
end
end
diff --git a/mix.lock b/mix.lock
index ed4a536..f4549a7 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,14 +1,22 @@
%{
"benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"},
"castore": {:hex, :castore, "0.1.7", "1ca19eee705cde48c9e809e37fdd0730510752cc397745e550f6065a56a701e9", [:mix], [], "hexpm", "a2ae2c13d40e9c308387f1aceb14786dca019ebc2a11484fb2a9f797ea0aa0d8"},
+ "certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"},
"cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"},
"cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"},
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
"finch": {:hex, :finch, "0.3.1", "55d3d38eb61cd8356b6e1c696d3c526ed5b2c4e1f8643096e66a100f88001c79", [:mix], [{:castore, "~> 0.1.5", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.2.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5c47c6d05d95b1587b57784782a327d1b26952baf295f7044cbb91e829836ee9"},
"gun": {:git, "https://github.com/ninenines/gun", "921c47146b2d9567eac7e9a4d2ccc60fffd4f327", [ref: "921c47146b2d9567eac7e9a4d2ccc60fffd4f327"]},
+ "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"},
+ "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"},
+ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
+ "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
"mint": {:hex, :mint, "1.1.0", "1fd0189edd9e3ffdbd7fcd8bc3835902b987a63ec6c4fd1aa8c2a56e2165f252", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bfd316c3789340b682d5679a8116bcf2112e332447bdc20c1d62909ee45f48d"},
"nimble_options": {:hex, :nimble_options, "0.2.1", "7eac99688c2544d4cc3ace36ee8f2bf4d738c14d031bd1e1193aab096309d488", [:mix], [], "hexpm", "ca48293609306791ce2634818d849b7defe09330adb7e4e1118a0bc59bed1cf4"},
"nimble_pool": {:hex, :nimble_pool, "0.1.0", "ffa9d5be27eee2b00b0c634eb649aa27f97b39186fec3c493716c2a33e784ec6", [:mix], [], "hexpm", "343a1eaa620ddcf3430a83f39f2af499fe2370390d4f785cd475b4df5acaf3f9"},
+ "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
"ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"},
+ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
"telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"},
+ "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"},
}

File Metadata

Mime Type
text/x-diff
Expires
Sat, Nov 23, 8:23 AM (19 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38918
Default Alt Text
(23 KB)

Event Timeline