For some reason, I can't seem to serve more than a bit under 2^14 tcp requests without elixer hanging.
This happens consistently in multiple projects I have set up. Below is a boiled down version that exhibits the behavior.
For some reason, I can't seem to serve more than a bit under 2^14 tcp requests without elixer hanging.
This happens consistently in multiple projects I have set up. Below is a boiled down version that exhibits the behavior.
defmodule Counter do | |
def start_link do | |
Agent.start_link(fn -> 0 end) | |
end | |
def hit(counter) do | |
Agent.update(counter, &(&1 + 1)) | |
end | |
def get(counter) do | |
Agent.get(counter, (&(&1))) | |
end | |
def watch(counter) do | |
IO.puts "Requests served: #{get(counter)}" | |
:timer.sleep(2000) | |
watch(counter) | |
end | |
end | |
defmodule TestServer do | |
def start(port, counter) do | |
{:ok, socket} = :gen_tcp.listen(port, [ | |
:binary, packet: :line, backlog: 2048, | |
active: false, reuseaddr: true]) | |
do_accept(socket, counter) | |
end | |
defp do_accept(socket, counter) do | |
{:ok, client} = :gen_tcp.accept(socket) | |
Counter.hit(counter) | |
body = "Something clever..." | |
:gen_tcp.send(client, "HTTP/1.1 200 OK\r\n") | |
:gen_tcp.send(client, "Server: MechWarrior/0.1\r\n") | |
:gen_tcp.send(client, "Content-Length: #{String.length(body)}\r\n") | |
:gen_tcp.send(client, "Connection: close\r\n") | |
:gen_tcp.send(client, "\r\n") | |
:gen_tcp.send(client, body) | |
:gen_tcp.close(client) | |
do_accept(socket, counter) | |
end | |
end | |
{:ok, counter} = Counter.start_link | |
spawn_link Counter, :watch, [counter] | |
TestServer.start(4000, counter) |
$ ab -r -c 1 -n 18000 http://192.168.22.176:4000/as | |
This is ApacheBench, Version 2.3 <$Revision: 1706008 $> | |
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ | |
Licensed to The Apache Software Foundation, http://www.apache.org/ | |
Benchmarking 192.168.22.176 (be patient) | |
Completed 1800 requests | |
Completed 3600 requests | |
Completed 5400 requests | |
Completed 7200 requests | |
Completed 9000 requests | |
Completed 10800 requests | |
Completed 12600 requests | |
Completed 14400 requests | |
Completed 16200 requests | |
Completed 18000 requests | |
Finished 18000 requests | |
Server Software: MechWarrior/0.1 | |
Server Hostname: 192.168.22.176 | |
Server Port: 4000 | |
Document Path: /as | |
Document Length: 19 bytes | |
Concurrency Level: 1 | |
Time taken for tests: 37.134 seconds | |
Complete requests: 18000 | |
Failed requests: 3 | |
(Connect: 1, Receive: 1, Length: 1, Exceptions: 0) | |
Total transferred: 1835898 bytes | |
HTML transferred: 341981 bytes | |
Requests per second: 484.74 [#/sec] (mean) | |
Time per request: 2.063 [ms] (mean) | |
Time per request: 2.063 [ms] (mean, across all concurrent requests) | |
Transfer rate: 48.28 [Kbytes/sec] received | |
Connection Times (ms) | |
min mean[+/-sd] median max | |
Connect: 0 0 53.0 0 7110 | |
Processing: 0 2 193.5 0 25964 | |
Waiting: 0 0 1.0 0 138 | |
Total: 0 2 200.7 0 25964 | |
Percentage of the requests served within a certain time (ms) | |
50% 0 | |
66% 0 | |
75% 0 | |
80% 0 | |
90% 0 | |
95% 0 | |
98% 0 | |
99% 0 | |
100% 25964 (longest request) |
$ elixir 00-test.exs | |
Requests served: 0 | |
Requests served: 0 | |
Requests served: 0 | |
Requests served: 7164 | |
Requests served: 15794 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16348 | |
Requests served: 16349 | |
Requests served: 16349 | |
Requests served: 16349 | |
Requests served: 18000 | |
Requests served: 18000 | |
^C |
$ ab -r -c 1 -n 18000 http://192.168.22.176:4000/as | |
This is ApacheBench, Version 2.3 <$Revision: 1706008 $> | |
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ | |
Licensed to The Apache Software Foundation, http://www.apache.org/ | |
Benchmarking 192.168.22.176 (be patient) | |
Completed 1800 requests | |
Completed 3600 requests | |
Completed 5400 requests | |
Completed 7200 requests | |
Completed 9000 requests | |
Completed 10800 requests | |
Completed 12600 requests | |
Completed 14400 requests | |
Completed 16200 requests | |
Completed 18000 requests | |
Finished 18000 requests | |
Server Software: MechWarrior/0.1 | |
Server Hostname: 192.168.22.176 | |
Server Port: 4000 | |
Document Path: /as | |
Document Length: 19 bytes | |
Concurrency Level: 1 | |
Time taken for tests: 37.371 seconds | |
Complete requests: 18000 | |
Failed requests: 4 | |
(Connect: 1, Receive: 2, Length: 1, Exceptions: 0) | |
Total transferred: 1835898 bytes | |
HTML transferred: 341981 bytes | |
Requests per second: 481.65 [#/sec] (mean) | |
Time per request: 2.076 [ms] (mean) | |
Time per request: 2.076 [ms] (mean, across all concurrent requests) | |
Transfer rate: 47.97 [Kbytes/sec] received | |
Connection Times (ms) | |
min mean[+/-sd] median max | |
Connect: 0 0 55.6 0 7455 | |
Processing: 0 2 193.7 0 25986 | |
Waiting: 0 0 0.0 0 1 | |
Total: 0 2 201.5 0 25986 | |
Percentage of the requests served within a certain time (ms) | |
50% 0 | |
66% 0 | |
75% 0 | |
80% 0 | |
90% 0 | |
95% 0 | |
98% 0 | |
99% 0 | |
100% 25986 (longest request) |
$ elixir 00-test.exs | |
Requests served: 0 | |
Requests served: 0 | |
Requests served: 2856 | |
Requests served: 11161 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16352 | |
Requests served: 16354 | |
Requests served: 16354 | |
Requests served: 16354 | |
Requests served: 16354 | |
Requests served: 18000 | |
Requests served: 18000 | |
^C |
It always hangs extremely close to 2^14, which is the default Erlang max open ports
The longest request in each case is very similar, perhaps something timing out?