【问题标题】:Akka dispatcher configuration for io-related actors与 io 相关的 Actor 的 Akka 调度程序配置
【发布时间】:2017-11-07 10:59:39
【问题描述】:

我正在为与阻塞 io 相关的参与者配置一些通用调度程序并尝试找到合适的配置。

与 IO 相关的任务不消耗 CPU,因此我需要这样的配置,允许在对任务进行排队之前利用最大可用线程。

目前我正在考虑。

io-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    keep-alive-time = 30s
    fixed-pool-size = off
    core-pool-size-min = 128
    core-pool-size-max = 128
    max-pool-size-min = 128
    max-pool-size-max = 128

    allow-core-timeout = on
  }

}

通过这种方式,我将获得一个具有多达 128 个线程的收缩池。

实现这样的目的是正确的方法吗?

【问题讨论】:

    标签: java multithreading scala akka


    【解决方案1】:

    您明确设置 fixed-pool-size = off 但您随后将线程池配置为与固定大小池完全相同,这似乎是矛盾的。我认为以下配置与您的配置相同:

    io-dispatcher {
      type = Dispatcher
      executor = "thread-pool-executor"
      thread-pool-executor {
        keep-alive-time = 30s
        fixed-pool-size = 128
        allow-core-timeout = on
      }
    }
    

    除此之外,选择您的游泳池主要取决于您的需求,并且可能需要进行一些调整。如果您希望应用程序在大多数情况下对线程有较高的需求,那么您当前的配置可能没问题。

    如果需求主要由峰值组成,但大部分时间要低得多,则最好降低核心池大小。使用您当前的配置,即使您只需要几个线程(例如 10 个),您的池也将有 128 个线程。这是因为每次有新任务到达您的池时,如果池大小小于 128,它将不会重用现有线程,它只会创建一个新线程,尝试达到核心大小。同样,在低需求时期,这可能是一种浪费的线程分配。在这种情况下,将核心大小设置为平均需求,将最大大小设置为大于峰值需求的值。

    ThreadPoolExecutor 的解释在 javadoc 中很棒:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2013-03-11
      • 2023-02-07
      • 1970-01-01
      相关资源
      最近更新 更多