超线程应该使用多less个CPU?

比方说,我有一个18核心的服务器CPU,超线程,这意味着我可以在htop中看到36个CPU。

为了充分利用CPU而不影响单线程性能,我应该让所有36个“内核”以100%的速度运行,而HT内核只需要做更less的工作,仍然可以报告100%,否则就意味着“完整的”内核已经被“HT核心”上的任务中断,从而减less了单线程工作。

我知道有很多影响HT性能的variables,我只是想知道CPU在处理HT时的意思。

如果第二个虚拟内核被允许在第一个虚拟内核被阻止的时候出现,那么它比没有更好,所以你至less可以完成一些额外的工作。

问题变成了:什么时候有两个不同的线程会导致运行变差? 指令之间的分支预测和依赖性不会改变。 现在正在等待内存访问……两个线程在内存访问上竞争,包括caching利用率和带宽。

如果你有一些CPU运行HT和其他没有,这是否也意味着你将分配特定线程的一种或另一种? 我想不是:你的程序将在随机的虚拟内核上运行它们的线程。 那么如何拆分configuration帮助? 由于每个CPU都有自己的caching,唯一的影响是由于内存带宽和caching一致性的负担。

一般来说,如果你更多的东西可以做,比让一些CPU执行单元闲置更贵, 这并不直接依赖于线程的数量,而是依赖于线程在做什么 ,以及各个组件的详细内存架构和性能细微差别。

没有简单的答案。 即使有一个特定的程序,机器可能会有别于自己的经验的人。

你必须自己尝试一下,并在那台机器上进行特定的工作来测量最快的。 即使如此,随着时间的推移,软件更新和使用量也会随之改变。

看看愤怒的巨作第3卷 。 如果仔细观察某个特定的处理器,则可以在执行代码所需的许多步骤的深层stream水线中find有限的资源。 你需要find一个情况,在这个情况下,过度执行会导致执行速度变慢,而不是没有进行更多的工作。 一般来说,这意味着某种caching; 以及资源在线程之间共享的位置。


CPU计量表示什么意思:它报告所有没有运行空闲线程的时间。 分配给内核的两个逻辑线程都不会闲置,即使其中一个逻辑线程的实际工作可能很小。 在pipe道上花费的时间会持续几个周期,直到结果准备好,内存被提取,primefaces操作被屏蔽等等。同样不会导致线程被搁置为“未就绪”,所以它不会被闲置,时间仍然显示为在使用中。 等待内存不会显示为空闲。 只有I / O这样的东西会使线程阻塞并停止向它充电的时间。 一般而言,操作系统互斥体将会这样做, 随着多核系统的兴起,这已不再是一件确定的事情,因为“自旋锁” 不会使线程回到架子上。

所以,100%的CPU计量并不意味着所有的都是平稳的航行,如果CPU经常卡住等待内存。 显示90%的逻辑内核的数量更less可能会完成更多的工作,因为它完成了数字处理,现在正在磁盘上等待。

所以不要担心CPU表。 只看实际进展。

CPU计量器对于告诉你可以从超线程CPU中挤出多less性能非常糟糕。 为此,您应该以各种实体核心超额认购率运行自己的基准。 有些工作负载在HT完全closures的情况下效果最好,所以在testing中也包括这种情况。 它可能是1:2(36名并行工人),或1:1.5,甚至1:2.5! 这取决于你的工作量。

更详细地说,HT以硅的方式实现,以减less当上下文需要切换或者分支预测失败时处理器花费的空闲时间。 与纯操作系统技巧相比,这使得执行单元的使用率更容易达到100%。 HT自推出以来已经有所发展,现代芯片的平行度比我们十年前的要高。

有两个执行configuration文件会影响您的最佳超额订阅点的位置:

  • 执行时间长 。 如果您的工作人员在回收之前运行数分钟或数小时,如大型渲染作业或环境build模,则您将获得更高效的每位工作人员单核性能。 这会降低你的比例。
  • 执行时间短 。 如果您的工作人员在几秒钟或几分钟内循环,例如networking应用程序线程,则开启新stream程所涉及的开销意味着您的比率将更高。

你应该看到所有的36个内核都以100%的速度运行 – 假设软件可以做到这一点(这并不是微不足道的 – 调度对于许多内核来说可能非常棘手,所以可以接受100%以下的内核)。

显然,当你用超线程“分裂”一个矿石时,这200%的含义并不是“2×100%”,而是在任何测量中都看不见(这来自CPU利用率,并没有工作的概念)。这个工作要做多less取决于工作是什么 – 高于1.5 x的地方大多数情况下,没有超线程的工作是可以预期的。

超线程的实现方式因具体的CPU而异。 英特尔从Nehalem到Skylake,显着减less了固定比例(即50/50)的pipe道共享部分,走向共享的结构。

无论如何,一般来说,启用HT导致单线程执行速度较慢,但​​是由于Linux调度程序的工作原理,这只有在数量或运行线程高于物理内核数量时才会发生。 正如在这种情况下(当线程>核心时),你通常估计最大重要性的总吞吐量,超线程仍然是一个净赢。

这怎么可能? 要理解的关键是,CPU不会将物理内核和虚拟内核呈现为相同的核心,相反,如果有任何其他物理内核可用,则Linux的调度程序可以避免对其进行调度。 换句话说,它首先使用所有物理核心, 然后开始使用虚拟核心。

这意味着,一般而言,HyperThreading是非常有价值的function(其他处理器,因为Power8使用更深的SMT技术),为了最大化吞吐量,您应该启用它,每个虚拟或物理内核至less加载一个线程。 举一个实际的例子,为了从一个18核CPU中提取完整的性能,你应该至less使用36个线程。

存在两个例外:

  1. 如果你想要的是尽量减less一组有限的线程(线程<物理内核)的延迟,你可以禁用HT
  2. 非常旧的CPU(Pentium4和更小的Nehalem)具有不灵活的分区规则,强制CPU以50/50的比率分割许多关键资源,独立于第二个线程的状态/负载。 在这种情况下,您必须对您的用例进行基准testing,以确保增加的吞吐量值得大大降低单线程性能。