在 lagom 中:随着并发 http 调用的增加,线程数(akka.actor.default-dispatcher)不断增加。如何控制这种行为?
In lagom: on increasing concurrent http calls, thread count (akka.actor.default-dispatcher) keeps increasing. How to control this behaviour?
我们观察到,随着对我们服务的并发 http 调用的增加,线程数(akka.actor.default-dispatcher)不断增加(参见 visualVM 的屏幕截图)。同样在请求停止后,线程数不会下降。其中大部分仍处于 PARK 状态。
线程的这种按比例增加是预期的行为吗?我们如何控制它并重用相同的 actors 或在请求已服务后杀死 actors。
我是 运行 来自 lagom-samples 的购物车示例。
akka.actor.default-dispatcher {
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 2
parallelism-factor = 1.0
parallelism-max = 6
}
throughput = 1
}
VisualVM SS of thread analysis for lagom application
编辑:使用线程池执行器作为 akka.actor.default-dispatcher 在多个 (20-30) 并发请求后停止服务任何请求。甚至控制台也没有响应。
default-dispatcher {
type = Dispatcher
executor = default-executor
throughput = 1
default-executor = { fallback = thread-pool-executor }
thread-pool-executor = {
keep-alive-time = 60s
core-pool-size-min = 8
core-pool-size-factor = 3.0
core-pool-size-max = 64
max-pool-size-min = 8
max-pool-size-factor = 3.0
max-pool-size-max = 64
task-queue-size = -1
task-queue-type = linked
allow-core-timeout = on
}
}
在 akka 文档的介绍中强调了“可以在十几个线程上高效地调度数百万个 actor”。那么在那种情况下,为什么我们需要创建与并发请求数成比例的线程
你在打电话吗?例如,您是在呼叫 Thread.sleep 吗?或者使用一些同步 IO?如果是这样,那么您所看到的完全符合预期。
Lagom 是一个异步框架。它提供的所有 IO 和服务间通信机制都是非阻塞的。它的线程池针对非阻塞进行了调整。如果您只使用非阻塞调用,您会看到线程池的线程数非常低,并且您不会发现没有响应的情况。
但是当你开始阻塞的时候,所有的赌注都落空了。阻塞需要每个请求一个线程。
Akka 使用的默认调度程序是 fork 连接池。它专为异步使用而设计。如果您在其池中阻塞一个线程,它将启动另一个线程以确保其他任务可以继续。所以,这就是您看到线程池增长的原因。不要阻止,这样就不会发生。
另一方面,线程池执行器使用固定数量的线程。如果你阻止这个,那么你就有可能使整个应用程序陷入僵局。不要阻止,这样就不会发生。
我们观察到,随着对我们服务的并发 http 调用的增加,线程数(akka.actor.default-dispatcher)不断增加(参见 visualVM 的屏幕截图)。同样在请求停止后,线程数不会下降。其中大部分仍处于 PARK 状态。 线程的这种按比例增加是预期的行为吗?我们如何控制它并重用相同的 actors 或在请求已服务后杀死 actors。
我是 运行 来自 lagom-samples 的购物车示例。
akka.actor.default-dispatcher {
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 2
parallelism-factor = 1.0
parallelism-max = 6
}
throughput = 1
}
VisualVM SS of thread analysis for lagom application
编辑:使用线程池执行器作为 akka.actor.default-dispatcher 在多个 (20-30) 并发请求后停止服务任何请求。甚至控制台也没有响应。
default-dispatcher {
type = Dispatcher
executor = default-executor
throughput = 1
default-executor = { fallback = thread-pool-executor }
thread-pool-executor = {
keep-alive-time = 60s
core-pool-size-min = 8
core-pool-size-factor = 3.0
core-pool-size-max = 64
max-pool-size-min = 8
max-pool-size-factor = 3.0
max-pool-size-max = 64
task-queue-size = -1
task-queue-type = linked
allow-core-timeout = on
}
}
在 akka 文档的介绍中强调了“可以在十几个线程上高效地调度数百万个 actor”。那么在那种情况下,为什么我们需要创建与并发请求数成比例的线程
你在打电话吗?例如,您是在呼叫 Thread.sleep 吗?或者使用一些同步 IO?如果是这样,那么您所看到的完全符合预期。
Lagom 是一个异步框架。它提供的所有 IO 和服务间通信机制都是非阻塞的。它的线程池针对非阻塞进行了调整。如果您只使用非阻塞调用,您会看到线程池的线程数非常低,并且您不会发现没有响应的情况。
但是当你开始阻塞的时候,所有的赌注都落空了。阻塞需要每个请求一个线程。
Akka 使用的默认调度程序是 fork 连接池。它专为异步使用而设计。如果您在其池中阻塞一个线程,它将启动另一个线程以确保其他任务可以继续。所以,这就是您看到线程池增长的原因。不要阻止,这样就不会发生。
另一方面,线程池执行器使用固定数量的线程。如果你阻止这个,那么你就有可能使整个应用程序陷入僵局。不要阻止,这样就不会发生。