Multithreading 证明上下文切换是开销的工具?
目前正在使用Play!框架和阿克卡。我经常听说Scala Future的效率不高,因为每个映射都是一个推送到新线程的新任务。有一个潜在的问题,我是压倒性的线程池由于这种行为。我想知道有没有一个工具可以给我提供线索,在CPU限制的任务之间不必要的上下文切换会导致延迟恶化Multithreading 证明上下文切换是开销的工具?,multithreading,performance,playframework,threadpool,Multithreading,Performance,Playframework,Threadpool,目前正在使用Play!框架和阿克卡。我经常听说Scala Future的效率不高,因为每个映射都是一个推送到新线程的新任务。有一个潜在的问题,我是压倒性的线程池由于这种行为。我想知道有没有一个工具可以给我提供线索,在CPU限制的任务之间不必要的上下文切换会导致延迟恶化 谢谢 我用你的装备来分析比赛。如果应用程序中的所有时间都花在Akka的Dispatcher类、Scala的ExecutionContext类或Java的ForkJoinPool类上,那么很可能是您进行了太多的上下文切换。在Play
谢谢 我用你的装备来分析比赛。如果应用程序中的所有时间都花在Akka的
Dispatcher
类、Scala的ExecutionContext
类或Java的ForkJoinPool
类上,那么很可能是您进行了太多的上下文切换。在Play的性能测试中,我们发现(意外地)引入了一个额外的上下文开关,使性能降低了5%(尽管这是一个hello world性能测试,它什么都不做,总是对基准进行测试)。Dispatcher是一个线程,所以不是所有的时间都花在Dispatcher上了吗?我想知道的是,我们如何知道我们的上下文切换太多了。我可以从理论上对此进行推理,例如,如果您的任务是纯非阻塞IO(例如play.WS),那么拥有多个线程将降低请求的延迟。但我需要一个证据,你想看到什么来检测这种特定的行为?我也使用你的工具包。Dispatcher不是一个线程,它是一个线程池。每次“上下文切换”时,当任务被发送到线程池、排队等待执行、由池中的线程执行并执行时,都会有很多机制。上下文切换的成本是由这些机制支付的,因此,如果你看到所有的时间都花在这些课程上,这意味着你的应用程序的瓶颈在于上下文切换。我把“上下文切换”放在引号里,因为通常人们认为CPU上下文切换,但在线程上的任务之间切换实际上是一种不同类型的上下文切换。