Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Akka:如何配置路由器、调度器以提高性能?_Multithreading_Scala_Akka - Fatal编程技术网

Multithreading Akka:如何配置路由器、调度器以提高性能?

Multithreading Akka:如何配置路由器、调度器以提高性能?,multithreading,scala,akka,Multithreading,Scala,Akka,我已经在阿克卡打了两周了,仍然对一些基本概念感到困惑 我有一个非常简单的模式,包含三种演员: 主人 工人 记者 我将这些参与者配置如下: 主人 主调度员使用以下带RoundRobinRouter(10)的调度员: 工人 我在这个系统中有几个工人(ref),他们都从主服务器接收消息,每个人都使用RoundRobinRouter(10)路由器 通知者 只是一个演员用来从工人那里接收结果,然后计算。 它使用与worker相同的调度器 我对并行参数和路由器做了一些调整,但性能似乎没有变化。耗用100

我已经在阿克卡打了两周了,仍然对一些基本概念感到困惑

我有一个非常简单的模式,包含三种演员:

  • 主人
  • 工人
  • 记者
我将这些参与者配置如下:

主人 主调度员使用以下带RoundRobinRouter(10)的调度员:

工人 我在这个系统中有几个工人(ref),他们都从主服务器接收消息,每个人都使用RoundRobinRouter(10)路由器

通知者 只是一个演员用来从工人那里接收结果,然后计算。 它使用与worker相同的调度器

我对并行参数和路由器做了一些调整,但性能似乎没有变化。耗用1000万个任务需要80秒,每个任务至少需要500毫秒才能完成

所以我明白了,如果一个调度器的行为就像一个线程池,那么如果一个参与者在不使用路由器的情况下使用这个调度器,这意味着只有一个实例呢。接收块中的代码是否并行执行

以防万一我的代码中有其他东西把事情搞砸了:

这是运行此程序的虚拟机:

  • 32位ubuntu 12.04 lts
  • 内存5.0 GiB
  • 英特尔®核心™ i5-2500 CPU@3.30GHz×4
很抱歉,这个问题在这里不清楚。 如果有什么东西可以提高这个性能,请告诉我。 欢迎任何建议。先谢谢你

更新 对不起! 这是一千万的任务,不是一亿!
我的错,对不起

我没有看到你的配置文件。你也能做到这一点吗?调整参与者系统的性能是一项艰巨的任务。但如果不知道任务是什么(例如,它是否执行任何阻塞操作、从IO读取等),就很难判断该做什么或是否可以执行任何操作。从数字上看,您似乎已经具备了很高的并行性,因为按顺序执行1亿个500毫秒的任务所需的时间远远超过80秒。所以问题是,你的目标是什么。如果80秒对于您的用例来说足够快,我不会尝试进一步调整它,除非您有充分的理由这样做。您的机器中只有4个内核。所有的磁芯都能以接近100%的速度工作吗?在处理过程中是否会产生大量垃圾?您可以连接jconsole和/或启用gc日志以查看是否存在问题。如果所有处理器都已占用,并且您正在执行的任务是CPU受限的,即没有发生磁盘/网络io,则您可能达到了最大性能。当然,仍有可能进行优化。可能您有太多的上下文切换或太多的线程在运行,减少总线程的数量甚至可以提高性能。但是,我认为当我们看不到到底发生了什么时,我们没有任何有用的建议。另一个改进可能是取消两个自定义调度程序,并通过actor系统中的默认调度程序运行所有内容。这将减少运行的线程数量,从而减少CPU上的负载。只要没有一个演员在做阻止io的事情,我就不认为需要单独的调度员。
mailbox-capacity = 10000
executor = "fork-join-executor"
fork-join-executor {
  parallelism-min = 0
  parallelism-max = 600
  parallelism-factor = 3.0
}
type = Dispatcher
executor = "fork-join-executor"
fork-join-executor {
  parallelism-min = 0
  parallelism-max = 600
  parallelism-factor = 3.0
}
mailbox-capacity = 100000