Почему добавление асинхронной границы в Akka Streams стоит много ресурсов процессора? - PullRequest
0 голосов
/ 19 октября 2018

Я обнаружил, что моя программа Akka Streams неожиданно использовала процессор.

Вот простой пример:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Sink, Source}

implicit val system: ActorSystem = ActorSystem.create("QuickStart")
implicit val materializer: ActorMaterializer = ActorMaterializer()

Source.repeat(Unit)
  .to(Sink.ignore)
  .run()

Приведенный выше фрагмент кода позволит запускать исходные тексты и приемники втот же актер.

Он использует около 105% загрузки процессора на моем ноутбуке.Работает, как и ожидалось.

И после того, как я добавил асинхронную границу:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Sink, Source}

implicit val system: ActorSystem = ActorSystem.create("QuickStart")
implicit val materializer: ActorMaterializer = ActorMaterializer()

Source.repeat(Unit)
  .async // <------ async boundary here
  .to(Sink.ignore)
  .run()

Этот фрагмент кода теперь будет использовать около 600% загрузки ЦП на моем ноутбуке 4c8t.

Я ожидал, добавив асинхронную границу, этот поток будет работать в 2 отдельных субъектах и ​​будет стоить чуть более 200% процессорного времени.Но это стоит намного больше, чем 200%.

Что может заставить асинхронную границу использовать столько ресурсов ЦП?

1 Ответ

0 голосов
/ 24 октября 2018

Значение по умолчанию akka.actor.default-dispatcher - это значение Java ForkJoinPool.Инициализируется через звонок на ThreadPoolConfig.scaledPoolSize.Таким образом, по умолчанию используется начальный пул размером (количество процессоров * 3) и max = parallelism-max (64).

...