【问题标题】:Does running many IO threads impact performance of a few CPU-intensive threads?运行许多 IO 线程会影响一些 CPU 密集型线程的性能吗?
【发布时间】:2012-04-16 22:46:47
【问题描述】:

假设我有一台具有 12MB 缓存的 6 核机器。我将它用于具有几 GB 堆的服务器应用程序(其中大部分是 2 级 Hibernate 缓存)。

我注意到大多数时候我有少数线程主动服务于客户端请求(消耗 CPU 和与 DB 通信),以及大约 30-50 个线程只与客户端进行良好的同步网络 IO。

在学习 Java 内存模型时,我想知道这是否会影响性能。许多网络 IO 线程之一的上下文切换是否会破坏“活动”线程的线程/CPU 缓存?这种级别的并发本身是否有害(除了内存缓存)?

考虑到 CPU 缓存相对于整个应用程序内存有多小,这真的很重要吗?如何确定边界在哪里?

【问题讨论】:

  • 在相关说明中,为了最大限度地减少上下文切换,您是否考虑过使用异步 IO? stackoverflow.com/questions/2794535/…
  • @Slugart 这个问题实际上是使用异步 IO 研究的一部分。试图弄清楚我是否已经受到影响(以及我是否得到了正确的记忆模型的影响)以及是否值得。
  • 理论上它更有效,因为 PeterLawrey 提到会发生上下文切换。在实践中,由您来衡量场景中的差异。

标签: java multithreading java-memory-model


【解决方案1】:

多个网络 IO 线程之一的上下文切换是否会破坏“活动”线程的线程/CPU 缓存?

没有硬性保证,但我的直觉是,在实践中,CPU 缓存按数量级更新的频率比调度程序切换线程的频率高。如果是这种情况,那么线程上下文切换所需的缓存更新与已经进行的缓存更新相比,开销非常小。

如何确定边界在哪里?

通过实验和测量(分析),就像大多数与性能相关的问题一样。简单的理论近似值是行不通的,因为现代 PC 中真正发生的实际情况比任何合理的近似值都复杂。

【讨论】:

    【解决方案2】:

    当您的活动线程数多于 cpu 时,您会产生影响,并且会出现一些抖动。但是,抖动通常被认为是相对较小的 10 到 100 微秒。

    您可以让线程竞争缓存资源,但除了减少每个线程使用的活动数据量之外,您无能为力。这可以将您的 cpu 负载减少 2 倍或更多,但涉及大量工作,可能需要完全重写(包括一些 JDK 和第三方库),并且可能收效甚微。例如你需要多少 CPU 负载才能降低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2020-06-16
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多