Java 为大量并发图形配置akka dispatcher
我当前的系统大约有10万个运行图,每个运行图都是这样构建的: Amqp源~>处理阶段~>接收器 每个amqp源以每秒1的速率接收消息。只有大约10000个图形一次接收消息,所以我认为不需要超过10000个线程同时运行 以下是我当前使用的设置:Java 为大量并发图形配置akka dispatcher,java,akka,akka-stream,java.util.concurrent,Java,Akka,Akka Stream,Java.util.concurrent,我当前的系统大约有10万个运行图,每个运行图都是这样构建的: Amqp源~>处理阶段~>接收器 每个amqp源以每秒1的速率接收消息。只有大约10000个图形一次接收消息,所以我认为不需要超过10000个线程同时运行 以下是我当前使用的设置: my-dispatcher { type = Dispatcher executor = "fork-join-executor" fork-join-executor { parallelism-min = 16 parall
my-dispatcher {
type = Dispatcher
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 16
parallelism-factor = 2.0
parallelism-max = 32
}
throughput = 20
}
显然,这些设置没有为想要的性能定义足够的资源,因此我想知道:
谢谢。Akka和Akka Streams是基于异步的,参与者或流只使用一个线程进行大块处理,然后将线程交还给线程池,这很好,因为您可以根据实际执行线程所需的内核数量而不是要执行的内容来调整线程池的大小。拥有多个线程会带来开销,这既包括调度/切换,也包括JVM为每个线程分配大约0.5-1Mb的堆栈 因此,10000个参与者或正在运行的流仍然可以在一个小线程池中很好地执行。增加线程数量可能会减慢处理速度,而不是加快处理速度,因为在线程之间切换会花费更多的时间。即使是默认设置也可以,您应该在调优时始终进行基准测试,以查看更改是否达到预期效果
通常,fork-join池为参与者和流提供了良好的性能。基于线程池的应用程序适用于无法避免阻塞的情况(请参阅文档的这一部分:)Akka和Akka Streams基于异步,参与者或流仅使用线程进行大块处理,然后将线程交回线程池,这很好,因为您可以根据实际执行线程所需的内核数量而不是要执行的内容来调整线程池的大小。拥有多个线程会带来开销,这既包括调度/切换,也包括JVM为每个线程分配大约0.5-1Mb的堆栈 因此,10000个参与者或正在运行的流仍然可以在一个小线程池中很好地执行。增加线程数量可能会减慢处理速度,而不是加快处理速度,因为在线程之间切换会花费更多的时间。即使是默认设置也可以,您应该在调优时始终进行基准测试,以查看更改是否达到预期效果
通常,fork-join池为参与者和流提供了良好的性能。基于线程池的应用程序适用于无法避免阻塞的情况(请参阅文档的这一部分:)感谢您的回复!但我仍然不能完全理解在一个相当小的线程池上运行10000个并发流如何不会导致图形之间的阻塞,这最终会导致每个源上的消息累积。感谢您的回复!但我仍然不能完全理解在一个相当小的线程池上运行10000个并发流如何不会导致图之间的阻塞,这最终会导致每个源上的消息累积。