假设我有一个 18 核的服务器 cpu,开启了超线程,这意味着我可以在 htop 中看到 36 个 cpu。
为了充分利用 CPU 并且不影响单线程性能,我是否应该将所有 36 个“核心”的目标设为 100% 运行,而 HT 核心将只做更少的工作并且仍然报告 100%,或者这意味着“完整”内核已经被其“HT 内核”上的任务打断,从而减少了单线程工作?
我知道有很多变量会影响 HT 性能,我只是想知道处理 HT 时 cpu 计量表的含义。
假设我有一个 18 核的服务器 cpu,开启了超线程,这意味着我可以在 htop 中看到 36 个 cpu。
为了充分利用 CPU 并且不影响单线程性能,我是否应该将所有 36 个“核心”的目标设为 100% 运行,而 HT 核心将只做更少的工作并且仍然报告 100%,或者这意味着“完整”内核已经被其“HT 内核”上的任务打断,从而减少了单线程工作?
我知道有很多变量会影响 HT 性能,我只是想知道处理 HT 时 cpu 计量表的含义。
CPU 计量器无法告诉您可以从超线程 CPU 中挤出多少性能。为此,您应该以各种物理内核超额订阅率运行自己的基准测试。有一些工作负载在完全关闭 HT 的情况下效果最好,所以在你的测试中也包括这种情况。可能是 1:2(36 个并行工作器),或者 1:1.5,甚至是 1:2.5!这取决于你的工作量。
更详细地说,在需要切换上下文或分支预测失败时,以减少处理器空闲时间的方式在芯片上实现 HT。这使得达到 100% 的执行单元使用率比使用纯操作系统技巧更容易。HT 自推出以来一直在发展,现代芯片上的并行性比我们 10 年前使用的更多。
有两个执行配置文件会影响您的最佳超额订阅点的位置:
如果允许第二个虚拟核心在第一个虚拟核心被卡住时做出贡献,那总比没有好,因此您(至少)完成了一些额外的工作。
问题变成了:什么时候有两个不同的线程会导致一个运行得更糟?指令之间的分支预测和依赖关系不会改变。现在等待内存访问......两个线程在缓存利用率和带宽方面竞争内存访问。
如果您有一些 CPU 使用 HT 运行而其他 CPU 没有,这是否也意味着您会将特定线程分配给一种类型或另一种类型?我认为不会:您的程序将在随机虚拟内核上运行它们的线程。那么拆分配置有什么帮助呢?由于每个 CPU 都有自己的缓存,唯一的影响是由于内存带宽和缓存一致性的负担。
一般来说,你会达到这样的程度,即拥有更多你可以做的事情比让一些 CPU 执行单元闲置更昂贵。这并不直接取决于线程的数量,而是取决于线程在做什么,以及各种组件的详细内存架构和性能细微差别。
没有简单的答案。即使考虑到特定的程序,机器也可能与那些讲述自己经历的人不同。
您必须自己尝试并测量什么是最快的,在这台确切的机器上进行特定的工作。即便如此,它也可能随着软件更新和随着时间的推移而改变使用情况而改变。
看看Anger 的代表作第 3卷。如果您仔细查看某些特定的处理器,您会发现在执行代码所需的许多步骤的深层管道中资源有限。您需要找到过度承诺导致其执行速度较慢的情况,而不是不承担更多工作。一般来说,这意味着某种缓存;以及资源在线程之间共享的位置。
CPU 计量器是什么意思:它报告所有未花费在运行空闲线程上的时间。即使在其中一个上完成的实际工作可能很小,分配给核心的两个逻辑线程也不会空闲。管道卡住几个周期直到结果准备好,内存被提取,原子操作被隔离等所花费的时间。同样不会导致线程被搁置为“未准备好”,因此它不会空闲,并且时间仍然显示为正在使用。等待 RAM 不会显示为空闲。只有像 I/O 这样的东西才会使线程阻塞并停止向它收费。操作系统互斥锁通常会这样做,但随着多核系统的兴起,这不再是确定的事情,因为“自旋锁”不会让线程重新回到货架上。
因此,如果 CPU 经常卡在等待内存,那么 100% 的 CPU 计量表并不意味着一切顺利。显示 90% 的较少数量的逻辑核心很可能会完成更多工作,因为它完成了数字运算,现在正在磁盘上等待。
所以不用担心 CPU 仪表。看看实际取得的进展,只有.
您应该看到所有 36 个内核都以 100% 运行 - 假设软件可以做到这一点(这不是微不足道的 - 这么多内核的调度可能很棘手,因此低于 100% 的下降是可以接受的)。
显然,当您使用超线程“拆分”矿石时,那些 200% 的含义不是“2x100% - 在已完成的工作中。但这对于所采取的任何测量都是不可见的(来自 CPU 利用率并且没有完成工作的概念)。完成多少工作取决于工作是什么——在大多数情况下,预计在没有超线程的情况下工作量高于 1.5 倍。
超线程的实现方式因特定的 CPU uarch 而异。从 Nehalem 到 Skylake,英特尔显着减少了管道的固定比率(即:50/50)共享部分,转向动态共享结构。
无论如何,一般而言,启用 HT 会导致单线程执行速度稍慢,但由于 Linux 调度程序的工作原理,这仅在线程数或运行线程数高于物理内核数时才会发生。在这种情况下(当线程 > 内核时),您通常会重视最大重要性的总吞吐量,超线程仍然是一个净赢家。
这怎么可能?要理解的关键点是 CPU 不会将物理内核和虚拟内核呈现为相等的内核,而是以一种方式公开后者,如果任何其他物理内核可用,Linux 调度程序可以避免在它们上进行调度。换句话说,它首先使用所有物理内核,然后开始使用虚拟内核。
这意味着通常来说,超线程是一项非常有价值的功能(其他处理器,如 Power8,使用更深层次的 SMT 技术),为了最大限度地提高吞吐量,您应该启用它,为每个虚拟或物理核心加载至少一个线程的 CPU。举一个实际的例子,要从 18 核 CPU 中提取全部性能,您应该使用至少 36 个线程。
存在两个例外: