Как настроить Akka Http для низкой задержки
Я поправляю Akka Http server
сейчас и получая очень ужасные результаты при загрузке с параллельными запросами. Поскольку я не был уверен, возможно, у меня где-то был скрытый блокирующий запрос ввода-вывода, я подумал, что стоило бы протестировать пример проекта с сайта Akka Http:
Кроме того, вы можете загрузить новый проект sbt с уже настроенным HTTP Akka с помощью шаблона Giter8:
sbt -Dsbt.version=0.13.15 new https://github.com/akka/akka-http-scala-seed.g8
Я пошел вперед и загрузил его в соответствии с инструкциями и запустил сервер на локальном хосте:
/path/to/bootstrap/sbt run
[info] Running com.example.QuickstartServer
Server online at http://127.0.0.1:8080/
http://127.0.0.1:8080/
Я провел несколько очень простых тестов с "ab
" инструмент:
Простой тест, выполняющий последовательные запросы:
ab -n 1000 http://127.0.0.1:8080/users
Server Software: akka-http/10.1.5
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /users
Document Length: 12 bytes
Concurrency Level: 1
Time taken for tests: 0.880 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 165000 bytes
HTML transferred: 12000 bytes
Requests per second: 1136.74 [#/sec] (mean)
Time per request: 0.880 [ms] (mean)
Time per request: 0.880 [ms] (mean, across all concurrent requests)
Transfer rate: 183.17 [Kbytes/sec] received
Мы видим, что "time per request" is 0.880 ms [mean]
в этом случае
Теперь я увеличил параллелизм до 5:
ab -n 1000 -c 5 http://127.0.0.1:8080/users
Concurrency Level: 5
Time taken for tests: 0.408 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 165000 bytes
HTML transferred: 12000 bytes
Requests per second: 2450.39 [#/sec] (mean)
Time per request: 2.040 [ms] (mean)
Time per request: 0.408 [ms] (mean, across all concurrent requests)
Transfer rate: 394.84 [Kbytes/sec] received
Сейчас Time per request
увеличился довольно резко на 2,040 [мс] (среднее значение) (хотя пропускная способность намного выше)
и снова поднимает до 50 одновременных запросов:
ab -n 1000 -c 50 http://127.0.0.1:8080/users
Concurrency Level: 50
Time taken for tests: 0.277 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 165000 bytes
HTML transferred: 12000 bytes
Requests per second: 3607.35 [#/sec] (mean)
Time per request: 13.861 [ms] (mean)
Time per request: 0.277 [ms] (mean, across all concurrent requests)
Transfer rate: 581.26 [Kbytes/sec] received
Здесь задержка очень высока: 13,861мс по сравнению с первым случаем, который был на 0,880мс (задержка увеличилась примерно в 16 раз)
Этот простой сервер не имеет блокировки ввода-вывода.
Мне интересно, что я должен настроить, чтобы задержка была как можно ниже.
1 ответ
Косвенный ответ
Изучение akka-http-quickstart-scala.g8
Исходный код показывает, что все параллельные GET
запросы запрашивают Actor
чтобы получить Users
:
get {
val users: Future[Users] =
(userRegistryActor ? GetUsers).mapTo[Users]
complete(users)
}
Поэтому все GetUsers
запросы, отправляемые Актору, помещаются в очередь в почтовом ящике, и Актер обрабатывает их 1 к 1. Таким образом, все ваши одновременные соединения синхронизируются и обрабатываются последовательно, а не одновременно.
Хотя некоторая конфигурация точно настроит производительность ActorSystem
на вашей конкретной машине невозможно обойти тот факт, что дизайн этого конкретного проекта не был предназначен для минимизации задержки для нескольких одновременных операций чтения.
Чтобы получить тип производительности, который вы ищете, проект должен быть перепроектирован с чем-то вроде ReadWriteLock
,
Прямой ответ
Чтобы максимизировать производительность для конкретного оборудования, вам необходимо настроить конфигурации http и систему актера.