Fork Join Pool vs Fixed Thread Pool for akka http client-focused workload?
Fork Join Pool vs Fixed Thread Pool for akka http client-focused workload?
我为仅使用 akka http 客户端(通过主机连接池)的服务配置了一个 fork join 调度程序:
my-dispatcher {
type = Dispatcher
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 256
parallelism-factor = 128.0
parallelism-max = 2048
}
}
服务逻辑所做的唯一一件事就是从外部源请求,使用 jawn 对其进行解组,然后将 jawn ast 转换为 case class:
def get(uri: Uri)[T]: Future[T] = {
for {
response <- request(uri)
json <- Unmarshal(response.entity).to[Try[JValue]]
} yield json.transformTo[T]
}
我想知道对这种工作负载使用固定线程池是否会更有效率。此服务大约为 150 req/s,我希望将 CPU 的使用率保持在 1 CPU 以下(目前徘徊在 1.25-1.5 CPU 秒左右)。
根据 wisdom of the ancients,您的工作流是 I/O 绑定的,因此您应该选择一个由 CachedThreadPool
支持的执行上下文,但是如果需要节流,您应该使用 I/O 支持您的上下文一个FixedThreadPool
。
此外,根据部署环境,您可以通过 setting CPU affinity 将 Java 进程限制为 OS 级别的一个核心。
我为仅使用 akka http 客户端(通过主机连接池)的服务配置了一个 fork join 调度程序:
my-dispatcher {
type = Dispatcher
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 256
parallelism-factor = 128.0
parallelism-max = 2048
}
}
服务逻辑所做的唯一一件事就是从外部源请求,使用 jawn 对其进行解组,然后将 jawn ast 转换为 case class:
def get(uri: Uri)[T]: Future[T] = {
for {
response <- request(uri)
json <- Unmarshal(response.entity).to[Try[JValue]]
} yield json.transformTo[T]
}
我想知道对这种工作负载使用固定线程池是否会更有效率。此服务大约为 150 req/s,我希望将 CPU 的使用率保持在 1 CPU 以下(目前徘徊在 1.25-1.5 CPU 秒左右)。
根据 wisdom of the ancients,您的工作流是 I/O 绑定的,因此您应该选择一个由 CachedThreadPool
支持的执行上下文,但是如果需要节流,您应该使用 I/O 支持您的上下文一个FixedThreadPool
。
此外,根据部署环境,您可以通过 setting CPU affinity 将 Java 进程限制为 OS 级别的一个核心。