【问题标题】:Configuring thread pool to reduce context switching [duplicate]配置线程池以减少上下文切换
【发布时间】:2017-04-19 10:23:40
【问题描述】:

我正在阅读 Ignite 文档,现在我在 the section about performance。这是写的(强调我的):

默认情况下,Ignite 的主线程池大小设置为 2 倍 可用的 CPU 计数。在大多数情况下,每个内核保留 2 个线程 导致更快的应用程序性能,因为会更少 上下文切换和 CPU 缓存会更好地工作。

我不明白为什么如果我们每个核心有 2 个线程,上下文切换会更少?我认为如果所有线程都忙于某项工作,那么将会有很多上下文切换,因为我们不能运行两倍于内核数量的工作。这会损害性能。

这是什么意思?

【问题讨论】:

  • 也许它们计入虚拟 CPU 内核和超线程?
  • 他们的意思是什么?没有更多的上下文,这是不可能的。
  • @AndrewHenle 但这就是文档中的内容。
  • @St.Antario 好吧,他们必须有一些默认值,这似乎是他们的推理。甚至可能是真的。
  • 唯一可以解释推理的人是编写该文档的人,其他任何事情都只是猜测

标签: java multithreading threadpool


【解决方案1】:

答案是对陈述的解释 - 因此假设作者可能在想什么并提供我的观点。

如果我们假设每个内核都是超线程的,并且每个线程最大限度地利用分配给它的 CPU 时间,并且线程仍然绑定到 CPU 内核,那么这个说法可能是正确的。

或者

核心是单线程的,每个线程通过最小化上下文切换的数量来最大限度地利用可用的 CPU 时间(当一个被阻塞时,另一个进行计算)

对于与缓存相关的提及,进程线程必须在相当长的一段时间内保持绑定到同一个核心。


关于为什么正确的线程数比更多的线程数更重要的一个很好的想法,这里有一个很好的例子:https://blogs.mulesoft.com/biz/news/chasing-the-bottleneck-true-story-about-fighting-thread-contention-in-your-code/

除了处理器级别的上下文切换开销之外: 虽然过时了 - 给出了好主意 - http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

【讨论】:

猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 2014-12-05
  • 2013-07-15
  • 2012-12-18
  • 2011-07-23
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多