针对akka http客户端工作负载的Fork Join Pool vs Fixed Thread Pool?

pra*_*man 1 scala akka forkjoinpool akka-http

我有一个fork连接调度程序配置为仅使用akka http的客户端(通过主机连接池)的服务:

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"

  fork-join-executor {
    parallelism-min = 256
    parallelism-factor = 128.0
    parallelism-max = 2048
  }

}
Run Code Online (Sandbox Code Playgroud)

服务逻辑唯一要做的就是从外部源请求,使用jawn解组它,然后将jawn ast转换为case类:

def get(uri: Uri)[T]: Future[T] = {
    for {
      response <- request(uri)
      json <- Unmarshal(response.entity).to[Try[JValue]]
    } yield json.transformTo[T]
  }
Run Code Online (Sandbox Code Playgroud)

我想知道为这种工作负载使用固定线程池是否更有效.这项服务大约需要150 req/s,我想将CPU使用率保持在1 CPU以下(目前它的徘徊在1.25-1.5左右).

小智 7

根据古人智慧,你的工作流是I/O绑定的,所以你应该选择一个由a支持的执行上下文CachedThreadPool,但是如果需要限制,你应该用a来支持你的上下文FixedThreadPool.

此外,根据部署环境,您可以通过设置CPU关联性将Java进程限制为操作系统级别的一个核心.