У меня есть проект sbt: с версиями:
Versions of akka-actor, akka-stream = 2.4.17
Versions of akka-http-core and akka-http = 10.0.4
Вот как я запускаю сервер:
system = ActorSystem("my-server", conf)
mat = ActorMaterializer.create(system)
ec = system.dispatcher
httpService = Http().bindAndHandle(routeWithTypeAndLogging(routeType), bindHost, bindPort)
Я написал API, который спит только от 30 до60 мсек, которые я набрал из jmeter
, чтобы выяснить: сколько параллелизма я могу использовать для API, при этом клиент не сталкивается с более высокой пропускной способностью.API развернут на 20-ядерном компьютере 34G.API выглядит следующим образом:
get {
parameters('dummy') { dummy =>
complete{
Future {
Thread.sleep(30 + randomGenerator.nextInt(30))
GenericResponse(200, Map(), Response("Success"))
}(ioDispatcher)
}
}
}
Когда я запускаю этот API с 200 потоками из jmeter: я получаю следующий ответ:
summary + 88512 in 00:00:25 = 3522.2/s Avg: 55 Min: 30 Max: 1547 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 88513 in 00:00:25 = 3485.3/s Avg: 55 Min: 30 Max: 1547 Err: 0 (0.00%)
summary + 106546 in 00:00:30 = 3551.5/s Avg: 55 Min: 30 Max: 904 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 195059 in 00:00:55 = 3521.2/s Avg: 55 Min: 30 Max: 1547 Err: 0 (0.00%)
summary + 106825 in 00:00:30 = 3560.8/s Avg: 55 Min: 30 Max: 1127 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 301884 in 00:01:25 = 3535.1/s Avg: 55 Min: 30 Max: 1547 Err: 0 (0.00%)
Но когда я бью с 3 разных машин с 200каждый поток (всего 600 потоков): я получаю следующий ответ:
summary = 98338 in 00:01:22 = 1203.3/s Avg: 163 Min: 30 Max: 10022 Err: 70 (0.07%)
summary + 35672 in 00:00:30 = 1189.1/s Avg: 162 Min: 30 Max: 7944 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 134010 in 00:01:52 = 1199.5/s Avg: 163 Min: 30 Max: 10022 Err: 70 (0.05%)
summary + 35837 in 00:00:30 = 1194.6/s Avg: 173 Min: 30 Max: 9140 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 169847 in 00:02:22 = 1198.5/s Avg: 165 Min: 30 Max: 10022 Err: 70 (0.04%)
summary + 35024 in 00:00:30 = 1167.5/s Avg: 164 Min: 30 Max: 10040 Err: 69 (0.20%) Active: 200 Started: 200 Finished: 0
summary = 204871 in 00:02:52 = 1193.1/s Avg: 165 Min: 30 Max: 10040 Err: 139 (0.07%)
Как вы можете видеть, в обоих случаях я не могу получить больше, чем около 3600qps, но беспокоит то, что 600 потоков бьютсервер, он также ухудшен для клиента.
Я уже дал akka.http.server.max-connections
8192, а изменение akka.http.server.pipelining-limit
не влияет на вышеуказанные результаты.
Обновление akka-http до 10.0.11
тоже не помогло.