Как настроить Akka Http для низкой задержки - PullRequest
0 голосов
/ 06 декабря 2018

Я сейчас подправляю свой 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 раз)

Этопростой сервер не имеет блокировкиIO.

Мне интересно, что я должен настроить, чтобы задержка была как можно ниже.

1 Ответ

0 голосов
/ 07 декабря 2018

Косвенный ответ

Изучение исходного кода 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 конфигурации и конфигурацию системы актера .

...