【问题标题】:Tool to Prove a Context Switch is an Overhead?证明上下文切换的工具是开销?
【发布时间】:2016-04-11 08:56:25
【问题描述】:

目前正在使用 Play!Framework 和 Akka。我经常听到 Scala Future 效率不高,因为每个映射都是推送到新线程的新任务。由于这种行为,有一个潜在的问题是我压倒了线程池。我想知道是否有一个工具可以让我知道 CPU 绑定任务之间不必要的上下文切换会导致延迟恶化?

谢谢!

【问题讨论】:

    标签: multithreading performance playframework threadpool


    【解决方案1】:

    我使用 YourKit 来分析 Play。如果你的应用程序中的所有时间都花在 Akka 的 Dispatcher 类、Scala 的 ExecutionContext 类或 Java 的 ForkJoinPool 上,那么很可能你做了太多的上下文切换。在 Play 的性能测试中,我们发现(偶然)引入一个额外的上下文切换会使性能降低 5%(尽管这是一个 hello world 性能测试,它什么都不做,总是对基准测试持保留态度)。

    【讨论】:

    • Dispatcher 是一个线程,所以不是所有的时间都花在了 Dispatcher 上吗?我正在寻找的是我们如何知道我们的上下文切换太多了。我可以在理论上对此进行推理,例如,如果您的任务是纯粹的非阻塞 IO(例如 play.WS),那么拥有许多线程会减慢请求的延迟。但我需要一个证据,你想看什么来检测这种特定行为?我也使用 YourKit。
    • Dispatcher 不是线程,它是线程池。每次“上下文切换”时,当任务被发送到线程池、排队等待执行、被池中的线程占用并执行时,都会发生很多机制。正是在这些机制中支付了上下文切换的成本,所以如果您看到所有时间都花在这些类上,这意味着您的应用程序的瓶颈在于上下文切换。而且我把“上下文切换”放在引号中是因为通常人们认为 CPU 上下文切换,但线程上任务之间的切换实际上是一种不同类型的上下文切换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多