Акка Диспетчер Создание темы - PullRequest
0 голосов
/ 18 марта 2020

Я работаю над моделью Akka Actor. У меня есть сценарий использования более 1000 актеров, и я должен обработать их. Я думал об управлении количеством потоков через конфигурацию, определенную в application.conf.

Но нет. потока диспетчера, созданного в моем приложении, делает меня беспомощным в настройке конфигурации диспетчера. Каждый раз, когда я перезапускаю свое приложение, я вижу различное количество созданных потоков диспетчера (я проверял это с помощью дампа потоков каждый раз после запуска приложения).

Даже количество потоков не совпадает с тем, которое я определил в параллелизме-мин. Из-за этого низкого количества потоков мое приложение обрабатывается очень медленно. На проверке нет. ядра в моей машине через код ниже:

Runtime.getRuntime (). availableProcessors ();

Отображается 40. Но нет. число созданных потоков диспетчера меньше 300, даже если я настроил параллелизм как 500.

Ниже приведен файл application.conf:

consumer-dispatcher {
  type = "Dispatcher"

  executor = "fork-join-executor"

  fork-join-executor {
    parallelism-min = 500
    parallelism-factor = 20.0
    parallelism-max = 1000
  }

  shutdown-timeout = 1s

  throughput = 1
}

Могу ли я узнать, на каком основании akka будет внутренне создавать потоки диспетчера и как я могу увеличить количество потоков диспетчера для увеличения параллельной обработки акторов?

1 Ответ

0 голосов
/ 21 марта 2020

X-Post от обсуждения.lightbend.com

Сначала позвольте мне ответить на вопрос напрямую.

A fork-join-executor будет поддержанный пулом java.util.concurrent.forkJoinPool с его параллелизмом, установленным на подразумеваемый параллелизм из конфигурации диспетчера. (процессоры с коэффициентом параллелизма *, но не больше max или меньше min). Итак, в вашем случае 800.

И хотя я не эксперт по реализации ForkJoinPool, источник для Java реализации ForkJoinPool говорит: «Все рабочие потоки создаются спрос, вызванный подачей задания, заменой уволенных работников и / или компенсацией за заблокированных работников ». и у него есть такие методы, как getActiveThreads(), поэтому ясно, что ForkJoinPool не просто наивно создает гигантский пул рабочих.

Другими словами, ожидается то, что вы видите: оно только создаст темы как они нужны. Если вам действительно нужен гигантский пул рабочих потоков c, вы можете создать исполнителя-пула потоков с фиксированным размером пула 800. Это даст вам реализацию, которую вы ищете.

Но, прежде чем вы это сделаете, я думаю, что вы полностью упускаете из виду актеров и Акку. Одна из причин, по которой людям нравятся актеры, заключается в том, что они намного легче, чем потоки, и могут дать вам гораздо больше параллелизма, чем потока. (Также обратите внимание, что параллелизм! = Параллелизм, как отмечено в документации по концепциям.) Поэтому попытка создать пул из 800 потоков для поддержки 1000 участников очень расточительна. Во введении akka docs подчеркивается, что «миллионы актеров могут быть эффективно запланированы на дюжине потоков».

Я не могу точно сказать, сколько потоков вам нужно, не зная вашего приложения (например, если у вас есть блокирующее поведение), но значения по умолчанию (которые дали бы вам коэффициент параллелизма 20), вероятно, просто хороши. Эталон, чтобы быть уверенным, но я действительно не думаю, что у вас есть проблемы с слишком малым количеством потоков. (Наблюдаемое вами поведение ForkJoinPool, кажется, подтверждает это.)

...