Hi,
I'll try to explain what I'm experiencing in my akka-http app.
(I found this issue but it's not been updated for almost a year and I'm not
sure it's relevant: https://github.com/akka/akka/issues/17395)
I noticed that under load a lot of connections (~1-2%) were dropped or
timed out. I started investigating, tuning os and akka params and trimming
down my sample app until I got this:
//N.B.: this is a test
implicit val system = ActorSystem()
implicit val mat: ActorMaterializer = ActorMaterializer()
implicit val ec = system.dispatcher
val binding: Future[ServerBinding] = Http().bind("0.0.0.0", 1104).map { conn ⇒
val promise = Promise[Unit]()
// I don't even wait for the end of the flow
val handler = Flow[HttpRequest].map { _ ⇒ promise.success(());
HttpResponse() }
// to be sure it's not a mapAsync(1) problem I use map and block here, same
result
val t0 = System.currentTimeMillis()
println(s"${Thread.currentThread().getName} start")
conn handleWith handler
Await.result(promise.future, 10.seconds)
println(s"${Thread.currentThread().getName} end
${System.currentTimeMillis() - t0}ms");
}.to(Sink.ignore).run()
Await.result(binding, 10.seconds)
When I run a small test using ab with something like "-c 1000" concurrent
connections or more (even if I'm handling one at a time here), some of the
requests immediately start getting unusual delays:
default-akka.actor.default-dispatcher-3 start
default-akka.actor.default-dispatcher-3 end 2015ms -> gets bigger
This keeps getting worse. After a while I can kill ab, wait some minutes
and make a single request and it either gets refused or times out. The
server is basically *dead*
*I get the exact same result with this, if you're wondering why I did all
that blocking and printing stuff above:*
val handler = Flow[HttpRequest].map(_ ⇒
HttpResponse()).alsoToMat(Sink.ignore)(Keep.right)
val binding: Future[ServerBinding] = Http().bind("0.0.0.0", 1104).mapAsync(1) {
conn ⇒
conn handleWith handler
}.to(Sink.ignore).run()
and the same happens if I use bindAndHandle with a simple route.
In my standard setup (bindAndHandle, any number of concurrent connections
(1k to 10k tried) and keepalive for the requests) I see a number of
connections between 1 and 3% failing.
This is what I get calling a simple route with bindAndHandle,
MaxConnections(10000) and connection keepalive enabled on the client: lots
of timeouts after just 10k calls already:
Concurrency Level: 4000
Time taken for tests: 60.605 seconds
Complete requests: 10000
Failed requests: 261
(Connect: 0, Receive: 87, Length: 87, Exceptions: 87)
Keep-Alive requests: 9913
...
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 7 31.3 0 191
Processing: 0 241 2780.8 5 60396
*Waiting*: 0 92 1270.8 5 *60396*
Total: 0 248 2783.5 5 60459
Percentage of the requests served within a certain time (ms)
...
90% 13
95% 255
98% 2061
99% 3911
100% 60459 (longest request)
It looks like it does the same on my local machine (mac) but I'm not 100%
sure. I'm doing the tests on an ubuntu 8-core 24GB ram vm
I really don't know what to do, I'm trying every possible combination of
system parameters and akka config but I keep getting the same result.
Basically everything I tried (changing /etc/security/limits.conf, changing
sysctl params, changing akka concurrent connections, backlog, dispatchers
etc) led to the same result, that is: *connections doing nothing and timing
out.* As if the execution were queued somehow
Is there something I'm missing? Some tuning parameter/config/something
else?
It looks like the piece of code that times out is conn handleWith handler even
if 'handler' does nothing and and it keeps doing it even after the load
stops. I.e. the connection is established correctly, but the processing is
stuck.
this is my ulimit -a:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 96360
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 100000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 32768
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
vm.swappiness = 0
Cheers
--
>>>>>>>>>> Read the docs: http://akka.io/docs/
>>>>>>>>>> Check the FAQ:
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
---
You received this message because you are subscribed to the Google Groups "Akka
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.