超线程应使用多少个CPU?


22

假设我有一个具有18个内核的服务器cpu,并且启用了超线程,这意味着我可以在htop中看到36 cpus。

为了充分利用CPU而不影响单线程性能,我的目标是使所有36个“内核”都以100%运行,而HT内核只会做更少的工作而仍然报告100%,或者意味着“完整”核心已经被其“ HT核心”上的任务打断了,从而减少了单线程工作?

我知道有很多影响HT性能的变量,我只想知道CPU仪表在处理HT时的含义。


6
超线程并不能真正为您提供两倍的cpus。可以将其想像成cpu读取两个程序,每当一个程序要执行需要花费几个周期的事情时,或者当它不使用所有资源(加法器,乘法器,加载器等)时,它将切换到其他程序,以便它可以使用它们。因此,要在所有线程上看到100%的内存,就需要在内核上运行兼容程序的巧合。
simpleuser 2016年

4
由于这种设计,超线程可以很好地处理混合工作负载。例如,所有虚拟机运行不同服务的管理程序。在这种情况下,可能甚至没有必要进行测试。对于更均匀的工作负载,通常需要进行测试以确保。
迈克尔·汉普顿

Answers:


14

如果允许第二个虚拟核心在第一个虚拟核心卡住的情况下做出贡献,那总比没有好,因此(至少)您会完成一些额外的工作。

问题就变成了:什么时候拥有两个不同的线程会导致一个线程运行得更糟?分支预测和指令之间的依赖关系不会改变。现在正在等待内存访问...这两个线程在高速缓存利用率和带宽方面都在争夺内存访问。

如果您有一些运行HT的CPU而没有运行HT的CPU,这是否还意味着您将为一种类型或另一种类型分配特定的线程?我认为不是:您的程序将在随机虚拟内核上运行其线程。那么拆分配置有何帮助?由于每个CPU都有自己的缓存,因此唯一的影响是由于内存带宽和缓存一致性负担。

一般情况下,你达到一个点,更多的东西,你可以做的是不是让一些CPU执行单元进入空闲状态更加昂贵。这不直接取决于线程数,而是取决于线程在做什么,以及各个组件的详细内存体系结构和性能细微差别。

没有简单的答案。即使考虑到特定的程序,该机器也可能与讲述自己的经历的人有所不同。

您必须自己尝试一下,并通过该特定机器上的特定工作来衡量最快的方法。即使这样,它也可能随着软件更新和使用情况的变化而改变。

看一下《愤怒》大号作品的第3卷。如果仔细查看某些特定的处理器,您会发现执行代码所需的许多步骤的深层管道中的资源有限。您需要找到一种情况,过度使用会导致执行速度变慢,而不是不进行更多工作。一般来说,这意味着某种缓存。以及线程之间共享资源的位置。


CPU计量器是什么意思:它报告所有花费在运行空闲线程上的时间。分配给内核的两个逻辑线程都不会处于空闲状态,即使在其中一个线程上完成的实际工作可能很小。直到完成结果准备,获取内存,对原子操作进行防护等,流水线停留了几个周期,同样也不会导致线程被搁置为“未就绪”,因此不会处于空闲状态,时间仍然显示为使用中。等待RAM不会显示为空闲。只有诸如I / O之类的东西才会使线程阻塞并停止为其充电。通常,操作系统互斥锁会这样做,但是随着多核系统的兴起,这不再是确定的事情,因为“自旋锁” 不会使线程回到货架上。

因此,如果CPU经常卡在等待内存中,那么100%的CPU表并不意味着一切顺利。较少的逻辑核心(占90%)很可能会完成更多工作,因为它完成了数字运算,现在正在磁盘上等待。

因此,不必担心CPU仪表。看实际取得的进展,


23

CPU指标很难告诉您可以从超线程CPU中挤出多少性能。为此,您应该以各种物理核心超额订购率运行自己的基准测试。在完全关闭HT的情况下,有些工作负载最适合工作,因此在测试中也要包括这种情况。可能是1:2(36个并行工作人员),1:1.5甚至是1:2.5!这取决于您的工作量。

更详细地说,在硅上实现HT的方式可以减少当上下文需要切换或分支预测失败时处理器空闲的时间。这比使用纯操作系统技巧更容易达到100%执行单元使用率。自从HT引入以来,它已经发展了,现代芯片上的并行性比我们十年前使用的更多。

有两个执行配置文件,这些配置文件将影响最佳的超额预订点:

  • 执行时间长。如果您的工作人员在回收前需要运行几分钟或几个小时,例如大型渲染工作或环境建模,则每个工作人员的单核性能将更高。这会降低您的比率。
  • 执行时间短。如果您的工作人员在几秒钟或一分钟之内(例如Web应用程序线程)循环,那么打开新进程所涉及的开销意味着您的比率将会更高。

几分钟?你的意思是几分钟?
Ismael Miguel

差不多了 1到5左右。以每名工人120秒和18名工人的时间计算,您每7秒钟要换一个新工人。很多原因归结为缓存位置。
sysadmin1138

1
您没听懂。您要说的是第二分钟。分钟始终具有相同的“大小”,即60秒。有时是61秒。
Ismael Miguel

4

您应该看到所有36个内核都以100%的速度运行-假设软件可以做到这一点(这并非微不足道-对于这么多内核,调度可能很棘手,因此低于100%的下降是可以接受的)。

显然,当您用超线程“分割”矿石时,这200%的含义不是“ 2x100%-完成的工作。但是,这对于任何测量(来自CPU利用率并且没有完成的工作)都是看不到的”。完成多少工作取决于工作量-在大多数情况下,预计不使用超线程的工作量是1.5倍以上。


3

实现超线程的方式因特定的CPU架构而异。从Nehalem到Skylake,Intel显着降低了管道的固定比率(即50/50)共享部分,转向了动态共享结构。

不管怎样,总的来说,使HT导致sligtly较慢的单线程执行,但由于如何Linux调度作品,这只有在数量或正在运行的线程是发生比物理内核的数量。在这种情况下(当线程>内核时),您通常会重视最重要的总吞吐量,因此超线程仍然是赢家。

这怎么可能?要理解的关键点是,CPU不会将物理内核和虚拟内核呈现为相等的内核,而是以某种方式公开后者,Linux调度程序可以避免在任何其他物理内核可用的情况下对其进行调度。换句话说,它首先使用所有物理核心,然后开始使用虚拟核心。

通常,这意味着超线程是一项非常有价值的功能(其他处理器,例如Power8,也使用了更深的SMT技术),为了使吞吐量最大化,您应该启用它,从而在CPU中为每个虚拟或物理内核加载至少一个线程。举一个实际的例子,要从18核CPU提取全部性能,您至少应使用36个线程。

存在两个例外:

  1. 如果您想要的只是最大程度地减少一组有限线程(其中的线程<物理内核)的延迟,则可以禁用HT
  2. 非常老的CPU(Pentium4,以较小的方式为Nehalem)具有不灵活的分区规则,该规则迫使CPU以50/50的比例独立于第二个线程的状态/负载来拆分许多关键资源。在这种情况下,您必须对用例进行基准测试,以确保增加的吞吐量值得明显降低的单线程性能。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.